﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ОписаниеПеременных

Перем ПолеТаблицаСопоставления;
Перем ПолеИнформацияСтатистикиСопоставленияОбъектов;
Перем ПолеДайджестСопоставления;
Перем ПолеТипСтрокаНеограниченнойДлины;

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

////////////////////////////////////////////////////////////////////////////////
// Экспортные служебные процедуры и функции.

// Выполняет сопоставление объектов этой информационной базы и информационной базы источника.
//  Формирует таблицу сопоставления для вывода пользователю.
//  Выявляет следующие типы связей объектов:
// - объекты, сопоставленные по ссылке (жесткая связь)
// - объекты, сопоставленные по информации в регистре сведений СоответствияОбъектовИнформационныхБаз (нежесткая связь)
// - объекты, сопоставленные по неутвержденным связям - связям незаписанным в информационную базу (текущие изменения)
// - несопоставленные объекты источника
// - несопоставленные объекты приемника (этой базы).
//
// Параметры:
//     Отказ - Булево - флаг отказа; поднимается в случае возникновения ошибок при работе процедуры.
// 
Процедура ВыполнитьСопоставлениеОбъектов(Отказ) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	
	// Выполняем сопоставление объектов информационных баз.
	ВыполнитьСопоставлениеОбъектовИнформационныхБаз(Отказ);
	
КонецПроцедуры

// Выполняет автоматическое сопоставление объектов по заданным пользователем полям сопоставления (полям поиска).
//  Сравнение полей сопоставления выполняется на строгое равенство.
//  Формирует таблицу автоматического сопоставления для вывода пользователю.
//
// Параметры:
//     Отказ - Булево - флаг отказа; поднимается в случае возникновения ошибок при работе процедуры.
//     СписокПолейСопоставления - СписокЗначений - список значений с полями,
//                                                 по которым необходимо выполнить сопоставление объектов.
// 
Процедура ВыполнитьАвтоматическоеСопоставлениеОбъектов(Отказ, СписокПолейСопоставления) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	
	ВыполнитьАвтоматическоеСопоставлениеОбъектовИнформационныхБаз(Отказ, СписокПолейСопоставления);
	
КонецПроцедуры

// Выполняет автоматическое сопоставление по заданным по умолчанию полям поиска.
// Список полей сопоставления равен списку используемых полей.
//
// Параметры:
//      Отказ - Булево - флаг отказа от обработки; поднимается в случае возникновения ошибки.
// 
Процедура ВыполнитьАвтоматическоеСопоставлениеПоУмолчанию(Отказ) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	
	// При автоматическом сопоставлении по умолчанию
	// список полей сопоставления равен списку используемых полей.
	СписокПолейСопоставления = СписокИспользуемыхПолей.Скопировать();
	
	ВыполнитьАвтоматическоеСопоставлениеОбъектовИнформационныхБазПоУмолчанию(Отказ, СписокПолейСопоставления);
	
	// Применяем результат автоматического сопоставления.
	ПрименитьТаблицуНеутвержденныхЗаписей(Отказ);
	
КонецПроцедуры

// Выполняет запись неутвержденных связей сопоставления (текущих изменений) в информационную базу.
// Записи хранятся в РС СоответствияОбъектовИнформационныхБаз.
//
// Параметры:
//      Отказ - Булево - флаг отказа от обработки; поднимается в случае возникновения ошибки.
// 
Процедура ПрименитьТаблицуНеутвержденныхЗаписей(Отказ) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	
	НачатьТранзакцию();
	
	Попытка
		
		Для Каждого СтрокаТаблицы Из ТаблицаНеутвержденныхСвязей Цикл
			
			Если ОбменДаннымиСервер.ЭтоПланОбменаXDTO(УзелИнформационнойБазы) Тогда
				
				Если Строка(СтрокаТаблицы.УникальныйИдентификаторИсточника.УникальныйИдентификатор()) = СтрокаТаблицы.УникальныйИдентификаторПриемника
					ИЛИ Не ЗначениеЗаполнено(СтрокаТаблицы.УникальныйИдентификаторПриемника) Тогда
					Продолжить;
				КонецЕсли;
				
				СтруктураЗаписи = Новый Структура("Ссылка, Идентификатор");
				
				СтруктураЗаписи.Вставить("УзелИнформационнойБазы", УзелИнформационнойБазы);
				СтруктураЗаписи.Вставить("Ссылка", СтрокаТаблицы.УникальныйИдентификаторИсточника);
				СтруктураЗаписи.Вставить("Идентификатор", СтрокаТаблицы.УникальныйИдентификаторПриемника);
				
				РегистрыСведений.ПубличныеИдентификаторыСинхронизируемыхОбъектов.ДобавитьЗапись(СтруктураЗаписи);
				
			Иначе
				
				СтруктураЗаписи = Новый Структура("УникальныйИдентификаторИсточника, УникальныйИдентификаторПриемника, ТипИсточника, ТипПриемника");
				
				СтруктураЗаписи.Вставить("УзелИнформационнойБазы", УзелИнформационнойБазы);
				
				ЗаполнитьЗначенияСвойств(СтруктураЗаписи, СтрокаТаблицы);
				
				РегистрыСведений.СоответствияОбъектовИнформационныхБаз.ДобавитьЗапись(СтруктураЗаписи);
				
			КонецЕсли;
			
		КонецЦикла;
		
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ЗаписьЖурналаРегистрации(НСтр("ru = 'Обмен данными'", ОбщегоНазначения.КодОсновногоЯзыка()),
			УровеньЖурналаРегистрации.Ошибка,,, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		Отказ = Истина;
		Возврат;
	КонецПопытки;
	
	ТаблицаНеутвержденныхСвязей.Очистить();
	
КонецПроцедуры

// Получает информацию статистики сопоставления объектов.
// Инициализируется свойство ДайджестСопоставления().
//
// Параметры:
//      Отказ - Булево - флаг отказа от обработки; поднимается в случае возникновения ошибки.
// 
Процедура ПолучитьИнформациюДайджестаСопоставленияОбъектов(Отказ) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	
	ТаблицаИсточника = ДанныеИнформационнойБазыИсточника(Отказ);
	
	Если Отказ Тогда
		Возврат;
	КонецЕсли;
	
	// Указываем пустой массив пользовательских полей, т.к. выборку полей производить нет необходимости.
	ПользовательскиеПоля = Новый Массив;
	
	МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
	
	// Получаем таблицы сопоставления объектов (сопоставленные, несопоставленные).
	ДанныеСопоставленияОбъектов(ТаблицаИсточника, ПользовательскиеПоля, МенеджерВременныхТаблиц);
	
	// Получаем информацию дайджеста сопоставления объектов.
	ПолучитьДайджестСопоставления(МенеджерВременныхТаблиц);
	
	МенеджерВременныхТаблиц.Закрыть();
	
КонецПроцедуры

// Выполняет загрузку данных из файла сообщения обмена в Информационную Базу только заданных типов объектов.
//
// Параметры:
//      Отказ - Булево - флаг отказа от обработки; поднимается в случае возникновения ошибки.
//      ТаблицыДляЗагрузки - Массив - массив типов, которые необходимо загрузить из сообщения обмена; элемент массива -
//                                    Строка.
// 
Процедура ВыполнитьЗагрузкуДанныхВИнформационнуюБазу(Отказ, ТаблицыДляЗагрузки) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	
	ДанныеУспешноЗагружены = Ложь;
	
	СтруктураНастроекОбмена = ОбменДаннымиСервер.СтруктураНастроекОбменаДляСеансаИнтерактивнойЗагрузки(УзелИнформационнойБазы, ИмяФайлаСообщенияОбмена);
	
	Если СтруктураНастроекОбмена.Отказ Тогда
		Возврат;
	КонецЕсли;
	
	ОбработкаОбменаДанными = СтруктураНастроекОбмена.ОбработкаОбменаДанными;
	
	ОбработкаОбменаДанными.ВыполнитьЗагрузкуДанныхВИнформационнуюБазу(ТаблицыДляЗагрузки);
	
	// Удаляем загруженные в ИБ таблицы из кэша обработки, т.к. они стали неактуальными.
	Для Каждого Элемент Из ТаблицыДляЗагрузки Цикл
		ОбработкаОбменаДанными.ТаблицыДанныхСообщенияОбмена().Удалить(Элемент);
	КонецЦикла;
	
	Если ОбработкаОбменаДанными.ФлагОшибки() Тогда
		НСтрока = НСтр("ru = 'При загрузке сообщения обмена возникли ошибки: %1'");
		НСтрока = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтрока, ОбработкаОбменаДанными.СтрокаСообщенияОбОшибке());
		ОбщегоНазначения.СообщитьПользователю(НСтрока,,,, Отказ);
		Возврат;
	КонецЕсли;
	
	ДанныеУспешноЗагружены = Не ОбработкаОбменаДанными.ФлагОшибки();
	
КонецПроцедуры

// Конструктор обработки
//
Процедура Конструктор() Экспорт
	
	// Заполняем список полей таблицы; из этих полей можно выбирать поля для сопоставления и отображения (поля поиска).
	СписокПолейТаблицы.ЗагрузитьЗначения(СтрРазделить(ПоляТаблицыПриемника, ",", Ложь));
	
	МассивПолейПоиска = СтрРазделить(ПоляПоискаТаблицыПриемника, ",", Ложь);
	
	// Если поля поиска не указаны, то выбираем поля поиска сами.
	Если МассивПолейПоиска.Количество() = 0 Тогда
		
		// для справочников
		ДобавитьПолеПоиска(МассивПолейПоиска, "Наименование");
		ДобавитьПолеПоиска(МассивПолейПоиска, "Код");
		ДобавитьПолеПоиска(МассивПолейПоиска, "Владелец");
		ДобавитьПолеПоиска(МассивПолейПоиска, "Родитель");
		
		// для документов и БП
		ДобавитьПолеПоиска(МассивПолейПоиска, "Дата");
		ДобавитьПолеПоиска(МассивПолейПоиска, "Номер");
		
		// популярные поля поиска
		ДобавитьПолеПоиска(МассивПолейПоиска, "Организация");
		ДобавитьПолеПоиска(МассивПолейПоиска, "ИНН");
		ДобавитьПолеПоиска(МассивПолейПоиска, "КПП");
		
		Если МассивПолейПоиска.Количество() = 0 Тогда
			
			Если СписокПолейТаблицы.Количество() > 0 Тогда
				
				МассивПолейПоиска.Добавить(СписокПолейТаблицы[0].Значение);
				
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЕсли;
	
	// Удаляем из массива полей поиска поля свыше указанного лимита; удаляем элементы массива с конца.
	ПроверитьКоличествоПолейСопоставленияВМассиве(МассивПолейПоиска);
	
	// Отмечаем в списке СписокПолейТаблицы поля поиска.
	Для Каждого Элемент Из СписокПолейТаблицы Цикл
		
		Если МассивПолейПоиска.Найти(Элемент.Значение) <> Неопределено Тогда
			
			Элемент.Пометка = Истина;
			
		КонецЕсли;
		
	КонецЦикла;
	
	ЗаполнитьСписокДополнительнымиПараметрами(СписокПолейТаблицы);
	
	// Формируем СписокИспользуемыхПолей из отмеченных элементов списка СписокПолейТаблицы.
	ЗаполнитьСписокОтмеченнымиЭлементами(СписокПолейТаблицы, СписокИспользуемыхПолей);
	
	// Формируем Таблицу сортировки.
	ЗаполнитьТаблицуСортировки(СписокИспользуемыхПолей);
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Функции-свойства

// Таблица сопоставления объектов.
//
// Возвращаемое значение:
//      ТаблицаЗначений - таблица сопоставления объектов.
//
Функция ТаблицаСопоставления() Экспорт
	
	Если ТипЗнч(ПолеТаблицаСопоставления) <> Тип("ТаблицаЗначений") Тогда
		
		ПолеТаблицаСопоставления = Новый ТаблицаЗначений;
		
	КонецЕсли;
	
	Возврат ПолеТаблицаСопоставления;
	
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Функции-свойства - дайджест сопоставления.

// Количество объектов текущего типа данных в файле сообщения обмена.
//
// Возвращаемое значение:
//     Число - количество объектов текущего типа данных в файле сообщения обмена.
//
Функция КоличествоОбъектовВИсточнике() Экспорт
	
	Возврат ДайджестСопоставления().КоличествоОбъектовВИсточнике;
	
КонецФункции

// Количество объектов текущего типа данных в этой информационной базе.
//
// Возвращаемое значение:
//     Число - количество объектов текущего типа данных в этой информационной базе.
//
Функция КоличествоОбъектовВПриемнике() Экспорт
	
	Возврат ДайджестСопоставления().КоличествоОбъектовВПриемнике;
	
КонецФункции

// Количество объектов, которые сопоставлены для текущего типа данных.
//
// Возвращаемое значение:
//     Число - количество объектов, которые сопоставлены для текущего типа данных.
//
Функция КоличествоОбъектовСопоставленных() Экспорт
	
	Возврат ДайджестСопоставления().КоличествоОбъектовСопоставленных;
	
КонецФункции

// Количество объектов, которые не сопоставлены для текущего типа данных.
//
// Возвращаемое значение:
//     Число - количество объектов, которые не сопоставлены для текущего типа данных.
//
Функция КоличествоОбъектовНесопоставленных() Экспорт
	
	Возврат ДайджестСопоставления().КоличествоОбъектовНесопоставленных;
	
КонецФункции

// Процент сопоставления объектов для текущего типа данных.
//
// Возвращаемое значение:
//     Число - процент сопоставления объектов для текущего типа данных.
//
Функция ПроцентСопоставленияОбъектов() Экспорт
	
	Возврат ДайджестСопоставления().ПроцентСопоставленияОбъектов;
	
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Локальные функции-свойства

Функция ДайджестСопоставления()
	
	Если ТипЗнч(ПолеДайджестСопоставления) <> Тип("Структура") Тогда
		
		// Инициализация структуры дайджеста сопоставления объектов.
		ПолеДайджестСопоставления = Новый Структура;
		ПолеДайджестСопоставления.Вставить("КоличествоОбъектовВИсточнике",       0);
		ПолеДайджестСопоставления.Вставить("КоличествоОбъектовВПриемнике",       0);
		ПолеДайджестСопоставления.Вставить("КоличествоОбъектовСопоставленных",   0);
		ПолеДайджестСопоставления.Вставить("КоличествоОбъектовНесопоставленных", 0);
		ПолеДайджестСопоставления.Вставить("ПроцентСопоставленияОбъектов",       0);
		
	КонецЕсли;
	
	Возврат ПолеДайджестСопоставления;
	
КонецФункции

Функция ИнформацияСтатистикиСопоставленияОбъектов()
	
	Если ТипЗнч(ПолеИнформацияСтатистикиСопоставленияОбъектов) <> Тип("Структура") Тогда
		
		// Инициализация структуры информации статистики.
		ПолеИнформацияСтатистикиСопоставленияОбъектов = Новый Структура;
		ПолеИнформацияСтатистикиСопоставленияОбъектов.Вставить("КоличествоОбъектовИсточникаСопоставленныхПоРегистру",    0);
		ПолеИнформацияСтатистикиСопоставленияОбъектов.Вставить("КоличествоОбъектовПриемникаСопоставленныхПоРегистру",    0);
		ПолеИнформацияСтатистикиСопоставленияОбъектов.Вставить("КоличествоОбъектовСопоставленныхПоНеутвержденнымСвязям", 0);
		
	КонецЕсли;
	
	Возврат ПолеИнформацияСтатистикиСопоставленияОбъектов;
	
КонецФункции

Функция ТипСтрокаНеограниченнойДлины()
	
	Если ТипЗнч(ПолеТипСтрокаНеограниченнойДлины) <> Тип("ОписаниеТипов") Тогда
		
		ПолеТипСтрокаНеограниченнойДлины = Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(0));
		
	КонецЕсли;
	
	Возврат ПолеТипСтрокаНеограниченнойДлины;
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Получение таблицы сопоставления.

Процедура ВыполнитьСопоставлениеОбъектовИнформационныхБаз(Отказ)
	
	ТаблицаИсточника = ДанныеИнформационнойБазыИсточника(Отказ);
	
	Если Отказ Тогда
		Возврат;
	КонецЕсли;
	
	// Получаем массив полей, которые выбрал пользователь.
	ПользовательскиеПоля = СписокИспользуемыхПолей.ВыгрузитьЗначения();
	
	// Поле ЭтоГруппа присутствует всегда для иерархических справочников.
	Если ПользовательскиеПоля.Найти("ЭтоГруппа") = Неопределено Тогда
		ДобавитьПолеПоиска(ПользовательскиеПоля, "ЭтоГруппа");
	КонецЕсли;
	
	МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
	
	// Получаем таблицы сопоставления объектов (сопоставленные, несопоставленные).
	ДанныеСопоставленияОбъектов(ТаблицаИсточника, ПользовательскиеПоля, МенеджерВременныхТаблиц);
	
	// Получаем информацию дайджеста сопоставления объектов.
	ПолучитьДайджестСопоставления(МенеджерВременныхТаблиц);
	
	// Получаем таблицу сопоставления.
	ПолеТаблицаСопоставления = РезультатСопоставленияОбъектов(ТаблицаИсточника, ПользовательскиеПоля, МенеджерВременныхТаблиц);
	
	МенеджерВременныхТаблиц.Закрыть();
	
	// сортируем таблицу
	ВыполнитьСортировкуТаблицыНаСервере();
	
	// Добавляем поле НомерПоПорядку и заполняем его.
	ДобавитьПолеНомераВТаблицуСопоставления();
	
КонецПроцедуры

Процедура ВыполнитьАвтоматическоеСопоставлениеОбъектовИнформационныхБаз(Отказ, СписокПолейСопоставления)
	
	ТаблицаИсточника = ДанныеИнформационнойБазыИсточника(Отказ);
	
	Если Отказ Тогда
		Возврат;
	КонецЕсли;
	
	// Пользовательские поля формируем по следующему алгоритму:
	// сначала добавляем поля, выбранные пользователем для отображения
	// затем все остальные поля таблицы.
	// Порядок полей важен, т.к. влияет на отображение пользователю в таблице результата автоматического сопоставления.
	ПользовательскиеПоля = Новый Массив;
	
	Для Каждого Элемент Из СписокИспользуемыхПолей Цикл
		
		ПользовательскиеПоля.Добавить(Элемент.Значение);
		
	КонецЦикла;
	
	Для Каждого Элемент Из СписокПолейТаблицы Цикл
		
		Если ПользовательскиеПоля.Найти(Элемент.Значение) = Неопределено Тогда
			
			ПользовательскиеПоля.Добавить(Элемент.Значение);
			
		КонецЕсли;
		
	КонецЦикла;
	
	// Список полей сопоставления формируем согласно порядку элементов в массиве ПользовательскиеПоля.
	СписокПолейСопоставленияНовый = Новый СписокЗначений;
	
	Для Каждого Элемент Из ПользовательскиеПоля Цикл
		
		ЭлементСписка = СписокПолейСопоставления.НайтиПоЗначению(Элемент);
		
		СписокПолейСопоставленияНовый.Добавить(Элемент, ЭлементСписка.Представление, ЭлементСписка.Пометка);
		
	КонецЦикла;
	
	МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
	
	// Получаем таблицы сопоставления объектов (сопоставленные, несопоставленные).
	ДанныеСопоставленияОбъектов(ТаблицаИсточника, ПользовательскиеПоля, МенеджерВременныхТаблиц);
	
	// Получаем таблицу автоматического сопоставления.
	ДанныеАвтоматическогоСопоставления(ТаблицаИсточника, СписокПолейСопоставленияНовый, ПользовательскиеПоля, МенеджерВременныхТаблиц);
	
	// Загружаем таблицу автоматически сопоставленных объектов в реквизит формы.
	ТаблицаАвтоматическиСопоставленныхОбъектов.Загрузить(ТаблицаАвтоматическиСопоставленныхОбъектовПолучить(МенеджерВременныхТаблиц, ПользовательскиеПоля));
	
	МенеджерВременныхТаблиц.Закрыть();
	
КонецПроцедуры

Процедура ВыполнитьАвтоматическоеСопоставлениеОбъектовИнформационныхБазПоУмолчанию(Отказ, СписокПолейСопоставления)
	
	ТаблицаИсточника = ДанныеИнформационнойБазыИсточника(Отказ);
	
	Если Отказ Тогда
		Возврат;
	КонецЕсли;
	
	// Получаем массив полей, которые выбрал пользователь.
	ПользовательскиеПоля = СписокИспользуемыхПолей.ВыгрузитьЗначения();
	
	МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
	
	// Получаем таблицы сопоставления объектов (сопоставленные, несопоставленные).
	ДанныеСопоставленияОбъектов(ТаблицаИсточника, ПользовательскиеПоля, МенеджерВременныхТаблиц);
	
	// Получаем таблицу автоматического сопоставления.
	ДанныеАвтоматическогоСопоставления(ТаблицаИсточника, СписокПолейСопоставления, ПользовательскиеПоля, МенеджерВременныхТаблиц);
	
	// Загружаем обновленную таблицу неутвержденных связей в реквизит объекта.
	ТаблицаНеутвержденныхСвязей.Загрузить(ОбъединитьТаблицыНеутвержденныхСвязейИАвтоматическогоСопоставления(МенеджерВременныхТаблиц));
	
	МенеджерВременныхТаблиц.Закрыть();
	
КонецПроцедуры

Процедура ДанныеСопоставленияОбъектов(ТаблицаИсточника, ПользовательскиеПоля, МенеджерВременныхТаблиц)
	
	// получаем таблицы:
	//
	// ТаблицаИсточника
	// ТаблицаНеутвержденныхСвязей
	// ТаблицаРегистраСоответствияОбъектовИнформационныхБаз.
	//
	// ТаблицаСопоставленныхОбъектовИсточникаПоРегистру
	// ТаблицаСопоставленныхОбъектовПриемникаПоРегистру
	// ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям.
	//
	// ТаблицаСопоставленныхОбъектов.
	//
	// ТаблицаНеСопоставленныхОбъектовИсточника
	// ТаблицаНеСопоставленныхОбъектовПриемника.
	//
	//
	
	// В текст запроса вместо служебных конструкций #any_text#
	// добавим параметры, поддержим работу конструктора, потом вернем #any_text#. 
	
	ТекстЗапроса = "
	|//////////////////////////////////////////////////////////////////////////////// {ТаблицаИсточника}
	|ВЫБРАТЬ
	|	
	|	&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаИсточника,
	|	
	|	ТаблицаИсточникаПараметр.Ссылка                  КАК Ссылка,
	|	ТаблицаИсточникаПараметр.УникальныйИдентификатор КАК УникальныйИдентификатор,
	|	&ТипИсточника                                    КАК ТипОбъекта
	|ПОМЕСТИТЬ ТаблицаИсточника
	|ИЗ
	|	&ТаблицаИсточникаПараметр КАК ТаблицаИсточникаПараметр
	|ГДЕ
	|	ТаблицаИсточникаПараметр.УникальныйИдентификатор <> """"
	|ИНДЕКСИРОВАТЬ ПО
	|	Ссылка,
	|	УникальныйИдентификатор
	|;
	|";
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
		"&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаИсточника,",
		"#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаИсточника#");
	
	Если ОбменДаннымиСервер.ЭтоПланОбменаXDTO(УзелИнформационнойБазы) Тогда
		
		ТекстЗапроса = ТекстЗапроса + "
			|//////////////////////////////////////////////////////////////////////////////// {ТаблицаРегистраСоответствияОбъектовИнформационныхБаз}
			|ВЫБРАТЬ
			|	Ссылка        КАК УникальныйИдентификаторИсточника,
			|	Идентификатор КАК УникальныйИдентификаторПриемника,
			|	""#ТипИсточника#"" КАК ТипПриемника,
			|	""#ТипПриемника#"" КАК ТипИсточника
			|ПОМЕСТИТЬ ТаблицаРегистраСоответствияОбъектовИнформационныхБаз
			|ИЗ
			|	РегистрСведений.ПубличныеИдентификаторыСинхронизируемыхОбъектов КАК СоответствияОбъектовИнформационныхБаз
			|ГДЕ
			|	  СоответствияОбъектовИнформационныхБаз.УзелИнформационнойБазы = &УзелИнформационнойБазы
			|	И СоответствияОбъектовИнформационныхБаз.Ссылка = &ЭмуляцияСтрокиЗамены
			|
			|ИНДЕКСИРОВАТЬ ПО
			|	УникальныйИдентификаторПриемника
			|;
			|";
			
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
				"СоответствияОбъектовИнформационныхБаз.Ссылка = &ЭмуляцияСтрокиЗамены",
				"ТИПЗНАЧЕНИЯ(СоответствияОбъектовИнформационныхБаз.Ссылка) = ТИП(#ТаблицаПриемника#)");
			
	Иначе
		
		ТекстЗапроса = ТекстЗапроса + "
			|//////////////////////////////////////////////////////////////////////////////// {ТаблицаРегистраСоответствияОбъектовИнформационныхБаз}
			|ВЫБРАТЬ
			|	УникальныйИдентификаторИсточника,
			|	УникальныйИдентификаторПриемника,
			|	ТипПриемника,
			|	ТипИсточника
			|ПОМЕСТИТЬ ТаблицаРегистраСоответствияОбъектовИнформационныхБаз
			|ИЗ
			|	РегистрСведений.СоответствияОбъектовИнформационныхБаз КАК СоответствияОбъектовИнформационныхБаз
			|ГДЕ
			|	  СоответствияОбъектовИнформационныхБаз.УзелИнформационнойБазы = &УзелИнформационнойБазы
			|	И СоответствияОбъектовИнформационныхБаз.ТипПриемника = &ТипИсточника
			|	И СоответствияОбъектовИнформационныхБаз.ТипИсточника = &ТипПриемника
			|ИНДЕКСИРОВАТЬ ПО
			|	УникальныйИдентификаторПриемника,
			|	ТипПриемника,
			|	ТипИсточника
			|;
			|";
			
	КонецЕсли;
	
	ТекстЗапроса = ТекстЗапроса + "
		|//////////////////////////////////////////////////////////////////////////////// {ТаблицаНеутвержденныхСвязей}
		|ВЫБРАТЬ
		|	
		|	УникальныйИдентификаторИсточника,
		|	УникальныйИдентификаторПриемника,
		|	ТипПриемника,
		|	ТипИсточника
		|	
		|ПОМЕСТИТЬ ТаблицаНеутвержденныхСвязей
		|ИЗ
		|	&ТаблицаНеутвержденныхСвязей КАК ТаблицаНеутвержденныхСвязей
		|ИНДЕКСИРОВАТЬ ПО
		|	УникальныйИдентификаторПриемника,
		|	ТипПриемника
		|;
		|";
		
	Если ОбменДаннымиСервер.ЭтоПланОбменаXDTO(УзелИнформационнойБазы) Тогда
		
		ТекстЗапроса = ТекстЗапроса + "
			|//////////////////////////////////////////////////////////////////////////////// {ТаблицаСопоставленныхОбъектовИсточникаПоРегистру}
			|ВЫБРАТЬ
			|	
			|	&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,
			|	
			|	&ПОЛЕ_СОРТИРОВКИ_Приемник,
			|	
			|	Ссылка,
			|	0 КАК СтатусСопоставления,               // сопоставленные объекты (0)
			|	0 КАК СтатусСопоставленияДополнительный, // сопоставленные объекты (0)
			|	
			|	ЭтоГруппаИсточник,
			|	ЭтоГруппаПриемник,
			|	
			|	// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
			|	УникальныйИдентификаторИсточника,
			|	УникальныйИдентификаторПриемника,
			|	ТипИсточника,
			|	ТипПриемника
			|ПОМЕСТИТЬ ТаблицаСопоставленныхОбъектовИсточникаПоРегистру
			|ИЗ
			|	(ВЫБРАТЬ
			|	
			|		&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовИсточникаПоРегистру_ВложенныйЗапрос,
			|		
			|		ЕСТЬNULL(СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника, ТаблицаПриемника.Ссылка) КАК Ссылка,
			|		
			|		&ТаблицаИсточникаЭтоГруппа                      КАК ЭтоГруппаИсточник,
			|		&СоответствияОбъектовИнформационныхБазЭтоГруппа КАК ЭтоГруппаПриемник,
			|	
			|		// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
			|		ЕСТЬNULL(СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника, ТаблицаПриемника.Ссылка)                  КАК УникальныйИдентификаторПриемника,
			|		ЕСТЬNULL(СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторПриемника, ТаблицаИсточника.УникальныйИдентификатор) КАК УникальныйИдентификаторИсточника,
			|		ЕСТЬNULL(СоответствияОбъектовИнформационныхБаз.ТипПриемника, ""#ТипИсточника#"")                                           КАК ТипИсточника,
			|		ЕСТЬNULL(СоответствияОбъектовИнформационныхБаз.ТипИсточника, ""#ТипПриемника#"")                                           КАК ТипПриемника
			|	ИЗ
			|		ТаблицаИсточника КАК ТаблицаИсточника
			|	ЛЕВОЕ СОЕДИНЕНИЕ
			|		ТаблицаРегистраСоответствияОбъектовИнформационныхБаз КАК СоответствияОбъектовИнформационныхБаз
			|	ПО
			|		  СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторПриемника = ТаблицаИсточника.УникальныйИдентификатор
			|		И СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника = &СоответствияОбъектовИнформационныхБаз
			|	ЛЕВОЕ СОЕДИНЕНИЕ
			|		Справочник.СценарииОбменовДанными КАК ТаблицаПриемника
			|	ПО
			|		  ТаблицаИсточника.Ссылка = ТаблицаПриемника.Ссылка
			|	ГДЕ
			|		НЕ СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника ЕСТЬ NULL
			|		ИЛИ НЕ ТаблицаПриемника.Ссылка ЕСТЬ NULL
			|	) КАК ВложенныйЗапрос
			|;
			|
			|//////////////////////////////////////////////////////////////////////////////// {ТаблицаСопоставленныхОбъектовПриемникаПоРегистру}
			|ВЫБРАТЬ
			|	
			|	&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,
			|	
			|	&ПОЛЕ_СОРТИРОВКИ_Приемник,
			|	
			|	Ссылка,
			|	0 КАК СтатусСопоставления,               // сопоставленные объекты (0)
			|	0 КАК СтатусСопоставленияДополнительный, // сопоставленные объекты (0)
			|	
			|	ЭтоГруппаИсточник,
			|	ЭтоГруппаПриемник,
			|	
			|	// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
			|	УникальныйИдентификаторИсточника,
			|	УникальныйИдентификаторПриемника,
			|	ТипИсточника,
			|	ТипПриемника
			|ПОМЕСТИТЬ ТаблицаСопоставленныхОбъектовПриемникаПоРегистру
			|ИЗ
			|	(ВЫБРАТЬ
			|	
			|		&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПриемникаПоРегистру_ВложенныйЗапрос,
			|		
			|		ТаблицаПриемника.Ссылка КАК Ссылка,
			|	
			|		&ТаблицаПриемникаЭтоГруппа КАК ЭтоГруппаИсточник,
			|		&ТаблицаПриемникаЭтоГруппа КАК ЭтоГруппаПриемник,
			|	
			|		// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
			|		СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника КАК УникальныйИдентификаторПриемника,
			|		СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторПриемника КАК УникальныйИдентификаторИсточника,
			|		СоответствияОбъектовИнформационныхБаз.ТипПриемника                     КАК ТипИсточника,
			|		СоответствияОбъектовИнформационныхБаз.ТипИсточника                     КАК ТипПриемника
			|	ИЗ
			|		Справочник.СценарииОбменовДанными КАК ТаблицаПриемника
			|	ЛЕВОЕ СОЕДИНЕНИЕ
			|		ТаблицаРегистраСоответствияОбъектовИнформационныхБаз КАК СоответствияОбъектовИнформационныхБаз
			|	ПО
			|		  СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника = ТаблицаПриемника.Ссылка
			|	ЛЕВОЕ СОЕДИНЕНИЕ
			|		ТаблицаСопоставленныхОбъектовИсточникаПоРегистру КАК ТаблицаСопоставленныхОбъектовИсточникаПоРегистру
			|	ПО
			|		ТаблицаСопоставленныхОбъектовИсточникаПоРегистру.Ссылка = ТаблицаПриемника.Ссылка
			|	
			|	ГДЕ
			|		НЕ СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника ЕСТЬ NULL
			|		И ТаблицаСопоставленныхОбъектовИсточникаПоРегистру.Ссылка ЕСТЬ NULL
			|	) КАК ВложенныйЗапрос
			|;
			|
			|//////////////////////////////////////////////////////////////////////////////// {ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям}
			|ВЫБРАТЬ
			|	
			|	&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,
			|	
			|	&ПОЛЕ_СОРТИРОВКИ_Приемник,
			|	
			|	Ссылка,
			|	3 КАК СтатусСопоставления,               // неутвержденные связи (3)
			|	0 КАК СтатусСопоставленияДополнительный, // сопоставленные объекты (0)
			|	
			|	ЭтоГруппаИсточник,
			|	ЭтоГруппаПриемник,
			|	
			|	// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
			|	УникальныйИдентификаторИсточника,
			|	УникальныйИдентификаторПриемника,
			|	ТипИсточника,
			|	ТипПриемника
			|ПОМЕСТИТЬ ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям
			|ИЗ
			|	(ВЫБРАТЬ
			|	
			|		&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям_ВложенныйЗапрос,
			|		
			|		ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника КАК Ссылка,
			|	
			|		&ТаблицаИсточникаЭтоГруппа            КАК ЭтоГруппаИсточник,
			|		&ТаблицаНеутвержденныхСвязейЭтоГруппа КАК ЭтоГруппаПриемник,
			|	
			|		// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
			|		ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника КАК УникальныйИдентификаторПриемника,
			|		ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторПриемника КАК УникальныйИдентификаторИсточника,
			|		ТаблицаНеутвержденныхСвязей.ТипПриемника КАК ТипИсточника,
			|		ТаблицаНеутвержденныхСвязей.ТипИсточника КАК ТипПриемника
			|	ИЗ
			|		ТаблицаИсточника КАК ТаблицаИсточника
			|	ЛЕВОЕ СОЕДИНЕНИЕ
			|		ТаблицаНеутвержденныхСвязей КАК ТаблицаНеутвержденныхСвязей
			|	ПО
			|		  ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторПриемника = ТаблицаИсточника.УникальныйИдентификатор
			|		И ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника = &ТаблицаПриемника
			|		
			|	ГДЕ
			|		НЕ ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника ЕСТЬ NULL
			|	) КАК ВложенныйЗапрос
			|;
			|";
			
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
			"&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,",
			"#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#");
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
			"&ПОЛЕ_СОРТИРОВКИ_Приемник,",
			"#ПОЛЕ_СОРТИРОВКИ_Приемник#");
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
			"&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовИсточникаПоРегистру_ВложенныйЗапрос,",
			"#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовИсточникаПоРегистру_ВложенныйЗапрос#");
			
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
			"&ТаблицаИсточникаЭтоГруппа",
			"#ТаблицаИсточникаЭтоГруппа#");
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
			"&СоответствияОбъектовИнформационныхБазЭтоГруппа",
			"#СоответствияОбъектовИнформационныхБазЭтоГруппа#");
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
			"И СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника = &СоответствияОбъектовИнформационныхБаз",
			"И ТИПЗНАЧЕНИЯ(СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника) = ТИП(#ТаблицаПриемника#)");
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
			"Справочник.СценарииОбменовДанными КАК ТаблицаПриемника",
			"#ТаблицаПриемника# КАК ТаблицаПриемника");
			
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
			"&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПриемникаПоРегистру_ВложенныйЗапрос,",
			"#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПриемникаПоРегистру_ВложенныйЗапрос#");
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
			"&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПриемникаПоРегистру_ВложенныйЗапрос,",
			"#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПриемникаПоРегистру_ВложенныйЗапрос#");
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
			"&ТаблицаПриемникаЭтоГруппа",
			"#ТаблицаПриемникаЭтоГруппа#");
			
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
			"&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям_ВложенныйЗапрос,",
			"#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям_ВложенныйЗапрос#");
			
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
			"&ТаблицаНеутвержденныхСвязейЭтоГруппа",
			"#ТаблицаНеутвержденныхСвязейЭтоГруппа#");
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
			"ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника = &ТаблицаПриемника",
			"ТИПЗНАЧЕНИЯ(ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника) = ТИП(#ТаблицаПриемника#)");
		
	Иначе
		
		ТекстЗапроса = ТекстЗапроса + "
			|//////////////////////////////////////////////////////////////////////////////// {ТаблицаСопоставленныхОбъектовИсточникаПоРегистру}
			|ВЫБРАТЬ
			|	
			|	&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,
			|	
			|	&ПОЛЕ_СОРТИРОВКИ_Приемник,
			|	
			|	Ссылка,
			|	0 КАК СтатусСопоставления,               // сопоставленные объекты (0)
			|	0 КАК СтатусСопоставленияДополнительный, // сопоставленные объекты (0)
			|	
			|	ЭтоГруппаИсточник,
			|	ЭтоГруппаПриемник,
			|	
			|	// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
			|	УникальныйИдентификаторИсточника,
			|	УникальныйИдентификаторПриемника,
			|	ТипИсточника,
			|	ТипПриемника
			|ПОМЕСТИТЬ ТаблицаСопоставленныхОбъектовИсточникаПоРегистру
			|ИЗ
			|	(ВЫБРАТЬ
			|	
			|		&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовИсточникаПоРегистру_ВложенныйЗапрос,
			|		
			|		СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника КАК Ссылка,
			|		
			|		&ТаблицаИсточникаЭтоГруппа                      КАК ЭтоГруппаИсточник,
			|		&СоответствияОбъектовИнформационныхБазЭтоГруппа КАК ЭтоГруппаПриемник,
			|	
			|		// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
			|		СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника КАК УникальныйИдентификаторПриемника,
			|		СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторПриемника КАК УникальныйИдентификаторИсточника,
			|		СоответствияОбъектовИнформационныхБаз.ТипПриемника                     КАК ТипИсточника,
			|		СоответствияОбъектовИнформационныхБаз.ТипИсточника                     КАК ТипПриемника
			|	ИЗ
			|		ТаблицаИсточника КАК ТаблицаИсточника
			|	ЛЕВОЕ СОЕДИНЕНИЕ
			|		ТаблицаРегистраСоответствияОбъектовИнформационныхБаз КАК СоответствияОбъектовИнформационныхБаз
			|	ПО
			|		  СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторПриемника = ТаблицаИсточника.УникальныйИдентификатор
			|		И СоответствияОбъектовИнформационныхБаз.ТипПриемника                     = ТаблицаИсточника.ТипОбъекта
			|	ГДЕ
			|		НЕ СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника ЕСТЬ NULL
			|	) КАК ВложенныйЗапрос
			|;
			|//////////////////////////////////////////////////////////////////////////////// {ТаблицаСопоставленныхОбъектовПриемникаПоРегистру}
			|ВЫБРАТЬ
			|	
			|	&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,
			|	
			|	&ПОЛЕ_СОРТИРОВКИ_Приемник,
			|	
			|	Ссылка,
			|	0 КАК СтатусСопоставления,               // сопоставленные объекты (0)
			|	0 КАК СтатусСопоставленияДополнительный, // сопоставленные объекты (0)
			|	
			|	ЭтоГруппаИсточник,
			|	ЭтоГруппаПриемник,
			|	
			|	// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
			|	УникальныйИдентификаторИсточника,
			|	УникальныйИдентификаторПриемника,
			|	ТипИсточника,
			|	ТипПриемника
			|ПОМЕСТИТЬ ТаблицаСопоставленныхОбъектовПриемникаПоРегистру
			|ИЗ
			|	(ВЫБРАТЬ
			|	
			|		&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПриемникаПоРегистру_ВложенныйЗапрос,
			|		
			|		ТаблицаПриемника.Ссылка КАК Ссылка,
			|	
			|		&ТаблицаПриемникаЭтоГруппа КАК ЭтоГруппаИсточник,
			|		&ТаблицаПриемникаЭтоГруппа КАК ЭтоГруппаПриемник,
			|	
			|		// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
			|		СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника КАК УникальныйИдентификаторПриемника,
			|		СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторПриемника КАК УникальныйИдентификаторИсточника,
			|		СоответствияОбъектовИнформационныхБаз.ТипПриемника                     КАК ТипИсточника,
			|		СоответствияОбъектовИнформационныхБаз.ТипИсточника                     КАК ТипПриемника
			|	ИЗ
			|		Справочник.СценарииОбменовДанными КАК ТаблицаПриемника
			|	ЛЕВОЕ СОЕДИНЕНИЕ
			|		ТаблицаРегистраСоответствияОбъектовИнформационныхБаз КАК СоответствияОбъектовИнформационныхБаз
			|	ПО
			|		  СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника = ТаблицаПриемника.Ссылка
			|		И СоответствияОбъектовИнформационныхБаз.ТипИсточника                     = &ТипПриемника
			|	ЛЕВОЕ СОЕДИНЕНИЕ
			|		ТаблицаСопоставленныхОбъектовИсточникаПоРегистру КАК ТаблицаСопоставленныхОбъектовИсточникаПоРегистру
			|	ПО
			|		ТаблицаСопоставленныхОбъектовИсточникаПоРегистру.Ссылка = ТаблицаПриемника.Ссылка
			|	
			|	ГДЕ
			|		НЕ СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника ЕСТЬ NULL
			|		И ТаблицаСопоставленныхОбъектовИсточникаПоРегистру.Ссылка ЕСТЬ NULL
			|	) КАК ВложенныйЗапрос
			|;
			|
			|//////////////////////////////////////////////////////////////////////////////// {ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям}
			|ВЫБРАТЬ
			|	
			|	&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,
			|	
			|	&ПОЛЕ_СОРТИРОВКИ_Приемник,
			|	
			|	Ссылка,
			|	3 КАК СтатусСопоставления,               // неутвержденные связи (3)
			|	0 КАК СтатусСопоставленияДополнительный, // сопоставленные объекты (0)
			|	
			|	ЭтоГруппаИсточник,
			|	ЭтоГруппаПриемник,
			|	
			|	// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
			|	УникальныйИдентификаторИсточника,
			|	УникальныйИдентификаторПриемника,
			|	ТипИсточника,
			|	ТипПриемника
			|ПОМЕСТИТЬ ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям
			|ИЗ
			|	(ВЫБРАТЬ
			|	
			|		&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям_ВложенныйЗапрос,
			|		
			|		ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника КАК Ссылка,
			|	
			|		&ТаблицаИсточникаЭтоГруппа            КАК ЭтоГруппаИсточник,
			|		&ТаблицаНеутвержденныхСвязейЭтоГруппа КАК ЭтоГруппаПриемник,
			|	
			|		// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
			|		ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника КАК УникальныйИдентификаторПриемника,
			|		ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторПриемника КАК УникальныйИдентификаторИсточника,
			|		ТаблицаНеутвержденныхСвязей.ТипПриемника КАК ТипИсточника,
			|		ТаблицаНеутвержденныхСвязей.ТипИсточника КАК ТипПриемника
			|	ИЗ
			|		ТаблицаИсточника КАК ТаблицаИсточника
			|	ЛЕВОЕ СОЕДИНЕНИЕ
			|		ТаблицаНеутвержденныхСвязей КАК ТаблицаНеутвержденныхСвязей
			|	ПО
			|		  ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторПриемника = ТаблицаИсточника.УникальныйИдентификатор
			|		И ТаблицаНеутвержденныхСвязей.ТипПриемника                     = ТаблицаИсточника.ТипОбъекта
			|		
			|	ГДЕ
			|		НЕ ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника ЕСТЬ NULL
			|	) КАК ВложенныйЗапрос
			|;
			|";
			
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
				"&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,",
				"#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#");
			
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
				"&ПОЛЕ_СОРТИРОВКИ_Приемник,",
				"#ПОЛЕ_СОРТИРОВКИ_Приемник#");
			
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
				"&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовИсточникаПоРегистру_ВложенныйЗапрос,",
				"#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовИсточникаПоРегистру_ВложенныйЗапрос#");
			
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
				"&ТаблицаИсточникаЭтоГруппа",
				"#ТаблицаИсточникаЭтоГруппа#");
			
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
				"&СоответствияОбъектовИнформационныхБазЭтоГруппа",
				"#СоответствияОбъектовИнформационныхБазЭтоГруппа#");
			
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
				"&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПриемникаПоРегистру_ВложенныйЗапрос,",
				"#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПриемникаПоРегистру_ВложенныйЗапрос#");
			
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
				"&ТаблицаПриемникаЭтоГруппа",
				"#ТаблицаПриемникаЭтоГруппа#");
			
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
				"Справочник.СценарииОбменовДанными КАК ТаблицаПриемника",
				"#ТаблицаПриемника# КАК ТаблицаПриемника");
			
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
				"&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям_ВложенныйЗапрос,",
				"#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям_ВложенныйЗапрос#");
			
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
				"&ТаблицаНеутвержденныхСвязейЭтоГруппа",
				"#ТаблицаНеутвержденныхСвязейЭтоГруппа#");
			
	КонецЕсли;
	
	ТекстЗапроса = ТекстЗапроса + "
		|//////////////////////////////////////////////////////////////////////////////// {ТаблицаСопоставленныхОбъектов}
		|ВЫБРАТЬ
		|	
		|	&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,
		|	
		|	&ПОЛЯ_СОРТИРОВКИ,
		|	
		|	Ссылка,
		|	СтатусСопоставления,
		|	СтатусСопоставленияДополнительный,
		|	
		|	// {ИНДЕКС КАРТИНКИ}
		|	ВЫБОР КОГДА ЭтоГруппаИсточник ЕСТЬ NULL
		|	ТОГДА 0
		|	ИНАЧЕ
		|		ВЫБОР КОГДА ЭтоГруппаИсточник = ИСТИНА
		|		ТОГДА 1
		|		ИНАЧЕ 2
		|		КОНЕЦ
		|	КОНЕЦ КАК ИсточникИндексКартинки,
		|	
		|	ВЫБОР КОГДА ЭтоГруппаПриемник ЕСТЬ NULL
		|	ТОГДА 0
		|	ИНАЧЕ
		|		ВЫБОР КОГДА ЭтоГруппаПриемник = ИСТИНА
		|		ТОГДА 1
		|		ИНАЧЕ 2
		|		КОНЕЦ
		|	КОНЕЦ КАК ПриемникИндексКартинки,
		|	
		|	// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
		|	УникальныйИдентификаторИсточника,
		|	УникальныйИдентификаторПриемника,
		|	ТипИсточника,
		|	ТипПриемника
		|ПОМЕСТИТЬ ТаблицаСопоставленныхОбъектов
		|ИЗ
		|	(
		|	ВЫБРАТЬ
		|	
		|		&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,
		|	
		|		&ПОЛЯ_СОРТИРОВКИ,
		|	
		|		Ссылка,
		|		СтатусСопоставления,
		|		СтатусСопоставленияДополнительный,
		|	
		|		ЭтоГруппаИсточник,
		|		ЭтоГруппаПриемник,
		|	
		|		// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
		|		УникальныйИдентификаторИсточника,
		|		УникальныйИдентификаторПриемника,
		|		ТипИсточника,
		|		ТипПриемника
		|	ИЗ
		|		ТаблицаСопоставленныхОбъектовИсточникаПоРегистру
		|	
		|	ОБЪЕДИНИТЬ ВСЕ
		|	
		|	ВЫБРАТЬ
		|	
		|		&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,
		|	
		|		&ПОЛЯ_СОРТИРОВКИ,
		|	
		|		Ссылка,
		|		СтатусСопоставления,
		|		СтатусСопоставленияДополнительный,
		|	
		|		ЭтоГруппаИсточник,
		|		ЭтоГруппаПриемник,
		|	
		|		// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
		|		УникальныйИдентификаторИсточника,
		|		УникальныйИдентификаторПриемника,
		|		ТипИсточника,
		|		ТипПриемника
		|	ИЗ
		|		ТаблицаСопоставленныхОбъектовПриемникаПоРегистру
		|	
		|	ОБЪЕДИНИТЬ ВСЕ
		|	
		|	ВЫБРАТЬ
		|	
		|		&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,
		|	
		|		&ПОЛЯ_СОРТИРОВКИ,
		|	
		|		Ссылка,
		|		СтатусСопоставления,
		|		СтатусСопоставленияДополнительный,
		|	
		|		ЭтоГруппаИсточник,
		|		ЭтоГруппаПриемник,
		|	
		|		// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
		|		УникальныйИдентификаторИсточника,
		|		УникальныйИдентификаторПриемника,
		|		ТипИсточника,
		|		ТипПриемника
		|	ИЗ
		|		ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям
		|	
		|	) КАК ВложенныйЗапрос
		|	
		|ИНДЕКСИРОВАТЬ ПО
		|	Ссылка
		|;
		|
		|//////////////////////////////////////////////////////////////////////////////// {ТаблицаНеСопоставленныхОбъектовИсточника}
		|ВЫБРАТЬ
		|	
		|	Ссылка,
		|	
		|	&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,
		|	
		|	&ПОЛЕ_СОРТИРОВКИ_Источник,
		|	
		|	-1 КАК СтатусСопоставления,               // несопоставленные объекты источника (-1)
		|	 1 КАК СтатусСопоставленияДополнительный, // несопоставленные объекты (1)
		|	
		|	// {ИНДЕКС КАРТИНКИ}
		|	ВЫБОР КОГДА ЭтоГруппаИсточник ЕСТЬ NULL
		|	ТОГДА 0
		|	ИНАЧЕ
		|		ВЫБОР КОГДА ЭтоГруппаИсточник = ИСТИНА
		|		ТОГДА 1
		|		ИНАЧЕ 2
		|		КОНЕЦ
		|	КОНЕЦ КАК ИсточникИндексКартинки,
		|	
		|	ВЫБОР КОГДА ЭтоГруппаПриемник ЕСТЬ NULL
		|	ТОГДА 0
		|	ИНАЧЕ
		|		ВЫБОР КОГДА ЭтоГруппаПриемник = ИСТИНА
		|		ТОГДА 1
		|		ИНАЧЕ 2
		|		КОНЕЦ
		|	КОНЕЦ КАК ПриемникИндексКартинки,
		|	
		|	// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
		|	УникальныйИдентификаторИсточника,
		|	УникальныйИдентификаторПриемника,
		|	ТипИсточника,
		|	ТипПриемника
		|ПОМЕСТИТЬ ТаблицаНеСопоставленныхОбъектовИсточника
		|ИЗ
		|	(ВЫБРАТЬ
		|		Количество(*),
		|		ЭтоГруппаИсточник,
		|		ЭтоГруппаПриемник,
		|		Ссылка,
		|		&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,
		|		УникальныйИдентификаторПриемника,
		|		УникальныйИдентификаторИсточника,
		|		ТипИсточника,
		|		ТипПриемника
		|	ИЗ
		|		(ВЫБРАТЬ
		|	
		|			&ТаблицаИсточникаЭтоГруппа КАК ЭтоГруппаИсточник,
		|			NULL                        КАК ЭтоГруппаПриемник,
		|		
		|			ТаблицаИсточника.Ссылка КАК Ссылка,
		|		
		|			&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаНеСопоставленныхОбъектовИсточника_ВложенныйЗапрос,
		|		
		|			// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
		|			NULL                                     КАК УникальныйИдентификаторПриемника,
		|			ТаблицаИсточника.УникальныйИдентификатор КАК УникальныйИдентификаторИсточника,
		|			&ТипИсточника                            КАК ТипИсточника,
		|			&ТипПриемника                            КАК ТипПриемника
		|		ИЗ
		|			ТаблицаИсточника КАК ТаблицаИсточника
		|		ЛЕВОЕ СОЕДИНЕНИЕ
		|			ТаблицаСопоставленныхОбъектов КАК ТаблицаСопоставленныхОбъектов
		|		ПО
		|			ТаблицаИсточника.Ссылка = ТаблицаСопоставленныхОбъектов.Ссылка
		|		ГДЕ
		|			ТаблицаСопоставленныхОбъектов.УникальныйИдентификаторИсточника ЕСТЬ NULL
		|
		|		ОБЪЕДИНИТЬ ВСЕ
		|
		|		ВЫБРАТЬ
		|			&ТаблицаИсточникаЭтоГруппа,
		|			NULL,
		|		
		|			ТаблицаИсточника.Ссылка,
		|		
		|			&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаНеСопоставленныхОбъектовИсточника_ВложенныйЗапрос1,
		|		
		|			// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
		|			NULL,
		|			ТаблицаИсточника.УникальныйИдентификатор,
		|			&ТипИсточника,
		|			&ТипПриемника
		|		ИЗ
		|			ТаблицаИсточника КАК ТаблицаИсточника
		|		ЛЕВОЕ СОЕДИНЕНИЕ
		|			ТаблицаСопоставленныхОбъектов КАК ТаблицаСопоставленныхОбъектов
		|		ПО
		|			ТаблицаИсточника.УникальныйИдентификатор = ТаблицаСопоставленныхОбъектов.УникальныйИдентификаторИсточника
		|		ГДЕ
		|			ТаблицаСопоставленныхОбъектов.Ссылка ЕСТЬ NULL
		|		) КАК ВложенныйЗапросПредварительный
		|	СГРУППИРОВАТЬ ПО
		|		ЭтоГруппаИсточник,
		|		ЭтоГруппаПриемник,
		|		Ссылка,
		|		&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,
		|		УникальныйИдентификаторПриемника,
		|		УникальныйИдентификаторИсточника,
		|		ТипИсточника,
		|		ТипПриемника
		|	ИМЕЮЩИЕ Количество(*) > 1) КАК ВложенныйЗапрос
		|;
		|
		|//////////////////////////////////////////////////////////////////////////////// {ТаблицаНеСопоставленныхОбъектовПриемника}
		|ВЫБРАТЬ
		|	
		|	Ссылка,
		|	
		|	&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,
		|	
		|	&ПОЛЕ_СОРТИРОВКИ_Приемник,
		|	
		|	1 КАК СтатусСопоставления,               // несопоставленные объекты приемника (1)
		|	1 КАК СтатусСопоставленияДополнительный, // несопоставленные объекты (1)
		|	
		|	// {ИНДЕКС КАРТИНКИ}
		|	ВЫБОР КОГДА ЭтоГруппаИсточник ЕСТЬ NULL
		|	ТОГДА 0
		|	ИНАЧЕ
		|		ВЫБОР КОГДА ЭтоГруппаИсточник = ИСТИНА
		|		ТОГДА 1
		|		ИНАЧЕ 2
		|		КОНЕЦ
		|	КОНЕЦ КАК ИсточникИндексКартинки,
		|	
		|	ВЫБОР КОГДА ЭтоГруппаПриемник ЕСТЬ NULL
		|	ТОГДА 0
		|	ИНАЧЕ
		|		ВЫБОР КОГДА ЭтоГруппаПриемник = ИСТИНА
		|		ТОГДА 1
		|		ИНАЧЕ 2
		|		КОНЕЦ
		|	КОНЕЦ КАК ПриемникИндексКартинки,
		|	
		|	// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
		|	УникальныйИдентификаторИсточника,
		|	УникальныйИдентификаторПриемника,
		|	ТипИсточника,
		|	ТипПриемника
		|ПОМЕСТИТЬ ТаблицаНеСопоставленныхОбъектовПриемника
		|ИЗ
		|	(ВЫБРАТЬ
		|	
		|		ТаблицаПриемника.Ссылка КАК Ссылка,
		|	
		|		&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаНеСопоставленныхОбъектовПриемника_ВложенныйЗапрос,
		|		
		|		NULL                        КАК ЭтоГруппаИсточник,
		|		&ТаблицаПриемникаЭтоГруппа КАК ЭтоГруппаПриемник,
		|		
		|		// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
		|		ТаблицаПриемника.Ссылка       КАК УникальныйИдентификаторПриемника,
		|		Неопределено                  КАК УникальныйИдентификаторИсточника,
		|		Неопределено                  КАК ТипИсточника,
		|		&ТипПриемника                 КАК ТипПриемника
		|	ИЗ
		|		Справочник.СценарииОбменовДанными КАК ТаблицаПриемника
		|	ЛЕВОЕ СОЕДИНЕНИЕ
		|		ТаблицаСопоставленныхОбъектов КАК ТаблицаСопоставленныхОбъектов
		|	ПО
		|		ТаблицаПриемника.Ссылка = ТаблицаСопоставленныхОбъектов.Ссылка
		|	ГДЕ
		|		ТаблицаСопоставленныхОбъектов.УникальныйИдентификаторПриемника ЕСТЬ NULL
		|	) КАК ВложенныйЗапрос
		|;
		|
		|";
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
		"&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,",
		"#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#");
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
		"&ПОЛЯ_СОРТИРОВКИ,",
		"#ПОЛЯ_СОРТИРОВКИ#");
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
		"&ПОЛЕ_СОРТИРОВКИ_Источник,",
		"#ПОЛЕ_СОРТИРОВКИ_Источник#");
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
		"&ТаблицаИсточникаЭтоГруппа",
		"#ТаблицаИсточникаЭтоГруппа#");
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
		"&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаНеСопоставленныхОбъектовИсточника_ВложенныйЗапрос,",
		"#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаНеСопоставленныхОбъектовИсточника_ВложенныйЗапрос#");
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
		"&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаНеСопоставленныхОбъектовИсточника_ВложенныйЗапрос1,",
		"#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаНеСопоставленныхОбъектовИсточника_ВложенныйЗапрос1#");
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
		"&ПОЛЕ_СОРТИРОВКИ_Приемник,",
		"#ПОЛЕ_СОРТИРОВКИ_Приемник#");
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
		"&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаНеСопоставленныхОбъектовПриемника_ВложенныйЗапрос,",
		"#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаНеСопоставленныхОбъектовПриемника_ВложенныйЗапрос#");
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
		"&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,",
		"#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#");
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
		"&ТаблицаПриемникаЭтоГруппа",
		"#ТаблицаПриемникаЭтоГруппа#");
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
		"Справочник.СценарииОбменовДанными КАК ТаблицаПриемника",
		"#ТаблицаПриемника# КАК ТаблицаПриемника");
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаИсточника#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ТаблицаИсточникаПараметр.# КАК #,"));
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ИсточникПолеNN, ПриемникПолеNN,"));
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПоСсылке_ВложенныйЗапрос#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ТаблицаПриемника.# КАК ПриемникПолеNN, ТаблицаИсточника.# КАК ИсточникПолеNN,"));
	
	Если ОбменДаннымиСервер.ЭтоПланОбменаXDTO(УзелИнформационнойБазы) Тогда
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовИсточникаПоРегистру_ВложенныйЗапрос#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ВЫРАЗИТЬ(ЕСТЬNULL(СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника, ТаблицаПриемника.Ссылка) КАК [ИмяТаблицыПриемника]).# КАК ПриемникПолеNN, ТаблицаИсточника.# КАК ИсточникПолеNN,"));
	Иначе
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовИсточникаПоРегистру_ВложенныйЗапрос#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ВЫРАЗИТЬ(СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника КАК [ИмяТаблицыПриемника]).# КАК ПриемникПолеNN, ТаблицаИсточника.# КАК ИсточникПолеNN,"));
	КонецЕсли;
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПриемникаПоРегистру_ВложенныйЗапрос#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ТаблицаПриемника.# КАК ПриемникПолеNN, NULL КАК ИсточникПолеNN,"));
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям_ВложенныйЗапрос#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ВЫРАЗИТЬ(ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника КАК [ИмяТаблицыПриемника]).# КАК ПриемникПолеNN, ТаблицаИсточника.# КАК ИсточникПолеNN,"));
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаНеСопоставленныхОбъектовИсточника_ВложенныйЗапрос#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ТаблицаИсточника.# КАК ИсточникПолеNN, NULL КАК ПриемникПолеNN,"));
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаНеСопоставленныхОбъектовИсточника_ВложенныйЗапрос1#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ТаблицаИсточника.#, NULL,"));

	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаНеСопоставленныхОбъектовПриемника_ВложенныйЗапрос#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "NULL КАК ИсточникПолеNN, ТаблицаПриемника.Ссылка.# КАК ПриемникПолеNN,"));
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЕ_СОРТИРОВКИ_Источник#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ИсточникПолеNN КАК ПолеСортировкиNN,"));
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЕ_СОРТИРОВКИ_Приемник#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ПриемникПолеNN КАК ПолеСортировкиNN,"));
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЯ_СОРТИРОВКИ#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ПолеСортировкиNN,"));
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ТаблицаПриемника#", ИмяТаблицыПриемника);
	
	Если ПользовательскиеПоля.Найти("ЭтоГруппа") <> Неопределено Тогда
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ТаблицаИсточникаЭтоГруппа#",            "ТаблицаИсточника.ЭтоГруппа");
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ТаблицаПриемникаЭтоГруппа#",            "ТаблицаПриемника.ЭтоГруппа");
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ТаблицаНеутвержденныхСвязейЭтоГруппа#", "ВЫРАЗИТЬ(ТаблицаНеутвержденныхСвязей.УникальныйИдентификаторИсточника КАК [ИмяТаблицыПриемника]).ЭтоГруппа");
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#СоответствияОбъектовИнформационныхБазЭтоГруппа#", "ВЫРАЗИТЬ(СоответствияОбъектовИнформационныхБаз.УникальныйИдентификаторИсточника КАК [ИмяТаблицыПриемника]).ЭтоГруппа");
		
	Иначе
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ТаблицаИсточникаЭтоГруппа#",            "NULL");
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ТаблицаПриемникаЭтоГруппа#",            "NULL");
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ТаблицаНеутвержденныхСвязейЭтоГруппа#", "NULL");
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#СоответствияОбъектовИнформационныхБазЭтоГруппа#", "NULL");
		
	КонецЕсли;
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяТаблицыПриемника]", ИмяТаблицыПриемника);
	
	Запрос = Новый Запрос;
	
	Запрос.Текст = ТекстЗапроса;
	Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	
	Запрос.УстановитьПараметр("ТаблицаИсточникаПараметр",    ТаблицаИсточника);
	Запрос.УстановитьПараметр("ТаблицаНеутвержденныхСвязей", ТаблицаНеутвержденныхСвязей.Выгрузить());
	Запрос.УстановитьПараметр("ТипИсточника",                ТипИсточникаСтрокой);
	Запрос.УстановитьПараметр("ТипПриемника",                ТипПриемникаСтрокой);
	Запрос.УстановитьПараметр("УзелИнформационнойБазы",      УзелИнформационнойБазы);
	
	Запрос.Выполнить();

КонецПроцедуры

Процедура ДанныеАвтоматическогоСопоставления(ТаблицаИсточника, СписокПолейСопоставления, ПользовательскиеПоля, МенеджерВременныхТаблиц)
	
	МассивОтмеченныхЭлементовСписка = ОбщегоНазначенияКлиентСервер.ОтмеченныеЭлементы(СписокПолейСопоставления);
	
	Если МассивОтмеченныхЭлементовСписка.Количество() = 0 Тогда
		
		ДанныеАвтоматическогоСопоставленияПоGUID(ПользовательскиеПоля, МенеджерВременныхТаблиц);
		
	Иначе
		
		ДанныеАвтоматическогоСопоставленияПоGUIDПлюсПоПолямПоиска(ТаблицаИсточника, СписокПолейСопоставления, ПользовательскиеПоля, МенеджерВременныхТаблиц);
		
	КонецЕсли;
	
КонецПроцедуры

Процедура ДанныеАвтоматическогоСопоставленияПоGUID(ПользовательскиеПоля, МенеджерВременныхТаблиц)
	
	// получаем таблицы:
	//
	// ТаблицаАвтоматическиСопоставленныхОбъектов
	
	ТекстЗапроса = "
	|//////////////////////////////////////////////////////////////////////////////// {ТаблицаАвтоматическиСопоставленныхОбъектов}
	|ВЫБРАТЬ
	|	
	|	Ссылка,
	|	
	|	&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,
	|	
	|	ПриемникИндексКартинки,
	|	ИсточникИндексКартинки,
	|	
	|	// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
	|	УникальныйИдентификаторИсточника,
	|	УникальныйИдентификаторПриемника,
	|	ТипИсточника,
	|	ТипПриемника
	|ПОМЕСТИТЬ ТаблицаАвтоматическиСопоставленныхОбъектов
	|ИЗ
	|	(ВЫБРАТЬ
	|		
	|		ТаблицаНеСопоставленныхОбъектовПриемника.Ссылка КАК Ссылка,
	|		
	|		ТаблицаНеСопоставленныхОбъектовПриемника.ПриемникИндексКартинки,
	|		ТаблицаНеСопоставленныхОбъектовИсточника.ИсточникИндексКартинки,
	|		
	|		&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаАвтоматическиСопоставленныхОбъектовПоGUID_ВложенныйЗапрос,
	|		
	|		// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
	|		ТаблицаНеСопоставленныхОбъектовИсточника.УникальныйИдентификаторИсточника КАК УникальныйИдентификаторИсточника,
	|		ТаблицаНеСопоставленныхОбъектовИсточника.ТипИсточника                     КАК ТипИсточника,
	|		ТаблицаНеСопоставленныхОбъектовПриемника.УникальныйИдентификаторПриемника КАК УникальныйИдентификаторПриемника,
	|		ТаблицаНеСопоставленныхОбъектовПриемника.ТипПриемника                     КАК ТипПриемника
	|	ИЗ
	|		ТаблицаНеСопоставленныхОбъектовПриемника КАК ТаблицаНеСопоставленныхОбъектовПриемника
	|	ЛЕВОЕ СОЕДИНЕНИЕ
	|		ТаблицаНеСопоставленныхОбъектовИсточника КАК ТаблицаНеСопоставленныхОбъектовИсточника
	|	ПО
	|		ТаблицаНеСопоставленныхОбъектовПриемника.Ссылка = ТаблицаНеСопоставленныхОбъектовИсточника.Ссылка
	|	
	|	ГДЕ
	|		НЕ ТаблицаНеСопоставленныхОбъектовИсточника.Ссылка ЕСТЬ NULL
	|	
	|	) КАК ВложенныйЗапрос
	|;
	|";
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
		"&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,",
		"#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#");
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
		"&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаАвтоматическиСопоставленныхОбъектовПоGUID_ВложенныйЗапрос,",
		"#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаАвтоматическиСопоставленныхОбъектовПоGUID_ВложенныйЗапрос#");
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ИсточникПолеNN, ПриемникПолеNN,"));
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаАвтоматическиСопоставленныхОбъектовПоGUID_ВложенныйЗапрос#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ТаблицаНеСопоставленныхОбъектовИсточника.ИсточникПолеNN КАК ИсточникПолеNN, ТаблицаНеСопоставленныхОбъектовПриемника.ПриемникПолеNN КАК ПриемникПолеNN,"));
	
	Запрос = Новый Запрос;
	Запрос.Текст = ТекстЗапроса;
	Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	
	Запрос.Выполнить();
	
КонецПроцедуры

Процедура ДанныеАвтоматическогоСопоставленияПоGUIDПлюсПоПолямПоиска(ТаблицаИсточника, СписокПолейСопоставления, ПользовательскиеПоля, МенеджерВременныхТаблиц)
	
	// получаем таблицы:
	//
	// ТаблицаАвтоматическиСопоставленныхОбъектовПолная
	// ТаблицаНеСопоставленныхОбъектовПриемникаПоПолям
	// ТаблицаНеСопоставленныхОбъектовИсточникаПоПолям
	// ТаблицаНеправильноСопоставленныхОбъектовИсточника
	// ТаблицаНеправильноСопоставленныхОбъектовПриемника.
	//
	// ТаблицаАвтоматическиСопоставленныхОбъектовПоGUID
	// ТаблицаАвтоматическиСопоставленныхОбъектовПоПолям
	// ТаблицаАвтоматическиСопоставленныхОбъектов.
	
	// формулы получения таблиц
	//
	// ТаблицаНеСопоставленныхОбъектовПриемникаПоПолям = ТаблицаНеСопоставленныхОбъектовПриемника - ТаблицаАвтоматическиСопоставленныхОбъектовПоGUID
	// ТаблицаНеСопоставленныхОбъектовИсточникаПоПолям = ТаблицаНеСопоставленныхОбъектовИсточника - ТаблицаАвтоматическиСопоставленныхОбъектовПоGUID
	//
	// ТаблицаАвтоматическиСопоставленныхОбъектов = ТаблицаАвтоматическиСопоставленныхОбъектовПоПолям + ТаблицаАвтоматическиСопоставленныхОбъектовПоGUID
	
	ТекстЗапроса = "
	|//////////////////////////////////////////////////////////////////////////////// {ТаблицаАвтоматическиСопоставленныхОбъектовПоGUID}
	|ВЫБРАТЬ
	|	
	|	Ссылка,
	|	
	|	&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,
	|	
	|	ПриемникИндексКартинки,
	|	ИсточникИндексКартинки,
	|		
	|	// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
	|	УникальныйИдентификаторИсточника,
	|	УникальныйИдентификаторПриемника,
	|	ТипИсточника,
	|	ТипПриемника
	|ПОМЕСТИТЬ ТаблицаАвтоматическиСопоставленныхОбъектовПоGUID
	|ИЗ
	|	(ВЫБРАТЬ
	|		
	|		ТаблицаНеСопоставленныхОбъектовПриемника.Ссылка КАК Ссылка,
	|		
	|		&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаАвтоматическиСопоставленныхОбъектовПоGUID_ВложенныйЗапрос,
	|		
	|		ТаблицаНеСопоставленныхОбъектовПриемника.ПриемникИндексКартинки,
	|		ТаблицаНеСопоставленныхОбъектовИсточника.ИсточникИндексКартинки,
	|		
	|		// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
	|		ТаблицаНеСопоставленныхОбъектовИсточника.УникальныйИдентификаторИсточника КАК УникальныйИдентификаторИсточника,
	|		ТаблицаНеСопоставленныхОбъектовИсточника.ТипИсточника                     КАК ТипИсточника,
	|		ТаблицаНеСопоставленныхОбъектовПриемника.УникальныйИдентификаторПриемника КАК УникальныйИдентификаторПриемника,
	|		ТаблицаНеСопоставленныхОбъектовПриемника.ТипПриемника                     КАК ТипПриемника
	|	ИЗ
	|		ТаблицаНеСопоставленныхОбъектовПриемника КАК ТаблицаНеСопоставленныхОбъектовПриемника
	|	ЛЕВОЕ СОЕДИНЕНИЕ
	|		ТаблицаНеСопоставленныхОбъектовИсточника КАК ТаблицаНеСопоставленныхОбъектовИсточника
	|	ПО
	|		ТаблицаНеСопоставленныхОбъектовПриемника.Ссылка = ТаблицаНеСопоставленныхОбъектовИсточника.Ссылка
	|	
	|	ГДЕ
	|		НЕ ТаблицаНеСопоставленныхОбъектовИсточника.Ссылка ЕСТЬ NULL
	|	
	|	) КАК ВложенныйЗапрос
	|;
	|
	|//////////////////////////////////////////////////////////////////////////////// {ТаблицаНеСопоставленныхОбъектовПриемникаПоПолям}
	|ВЫБРАТЬ
	|	
	|	&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаНеСопоставленныхОбъектов,
	|	
	|	ТаблицаНеСопоставленныхОбъектов.ПриемникИндексКартинки,
	|	
	|	// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
	|	ТаблицаНеСопоставленныхОбъектов.УникальныйИдентификаторИсточника,
	|	ТаблицаНеСопоставленныхОбъектов.УникальныйИдентификаторПриемника,
	|	ТаблицаНеСопоставленныхОбъектов.ТипИсточника,
	|	ТаблицаНеСопоставленныхОбъектов.ТипПриемника
	|ПОМЕСТИТЬ ТаблицаНеСопоставленныхОбъектовПриемникаПоПолям
	|ИЗ
	|	ТаблицаНеСопоставленныхОбъектовПриемника КАК ТаблицаНеСопоставленныхОбъектов
	|	ЛЕВОЕ СОЕДИНЕНИЕ
	|		ТаблицаАвтоматическиСопоставленныхОбъектовПоGUID КАК ТаблицаАвтоматическиСопоставленныхОбъектовПоGUID
	|	ПО
	|		ТаблицаНеСопоставленныхОбъектов.Ссылка = ТаблицаАвтоматическиСопоставленныхОбъектовПоGUID.Ссылка
	|ГДЕ
	|	ТаблицаАвтоматическиСопоставленныхОбъектовПоGUID.Ссылка ЕСТЬ NULL
	|;
	|
	|//////////////////////////////////////////////////////////////////////////////// {ТаблицаНеСопоставленныхОбъектовИсточникаПоПолям}
	|ВЫБРАТЬ
	|	
	|	&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаНеСопоставленныхОбъектов,
	|	
	|	ТаблицаНеСопоставленныхОбъектов.ИсточникИндексКартинки,
	|	
	|	// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
	|	ТаблицаНеСопоставленныхОбъектов.УникальныйИдентификаторИсточника,
	|	ТаблицаНеСопоставленныхОбъектов.УникальныйИдентификаторПриемника,
	|	ТаблицаНеСопоставленныхОбъектов.ТипИсточника,
	|	ТаблицаНеСопоставленныхОбъектов.ТипПриемника
	|ПОМЕСТИТЬ ТаблицаНеСопоставленныхОбъектовИсточникаПоПолям
	|ИЗ
	|	ТаблицаНеСопоставленныхОбъектовИсточника КАК ТаблицаНеСопоставленныхОбъектов
	|	ЛЕВОЕ СОЕДИНЕНИЕ
	|		ТаблицаАвтоматическиСопоставленныхОбъектовПоGUID КАК ТаблицаАвтоматическиСопоставленныхОбъектовПоGUID
	|	ПО
	|		ТаблицаНеСопоставленныхОбъектов.Ссылка = ТаблицаАвтоматическиСопоставленныхОбъектовПоGUID.Ссылка
	|ГДЕ
	|	ТаблицаАвтоматическиСопоставленныхОбъектовПоGUID.Ссылка ЕСТЬ NULL
	|;
	|
	|//////////////////////////////////////////////////////////////////////////////// {ТаблицаАвтоматическиСопоставленныхОбъектовПолная} // содержит повторяющиеся записи для источника и приемника
	|ВЫБРАТЬ
	|	
	|	&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,
	|	
	|	ПриемникИндексКартинки,
	|	ИсточникИндексКартинки,
	|		
	|	// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
	|	УникальныйИдентификаторИсточника,
	|	УникальныйИдентификаторПриемника,
	|	ТипИсточника,
	|	ТипПриемника
	|ПОМЕСТИТЬ ТаблицаАвтоматическиСопоставленныхОбъектовПолная
	|ИЗ
	|	(ВЫБРАТЬ
	|		
	|		&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаАвтоматическиСопоставленныхОбъектовПолная_ВложенныйЗапрос,
	|		
	|		ТаблицаНеСопоставленныхОбъектовПриемникаПоПолям.ПриемникИндексКартинки,
	|		ТаблицаНеСопоставленныхОбъектовИсточникаПоПолям.ИсточникИндексКартинки,
	|		
	|		// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
	|		ТаблицаНеСопоставленныхОбъектовИсточникаПоПолям.УникальныйИдентификаторИсточника КАК УникальныйИдентификаторИсточника,
	|		ТаблицаНеСопоставленныхОбъектовИсточникаПоПолям.ТипИсточника                     КАК ТипИсточника,
	|		ТаблицаНеСопоставленныхОбъектовПриемникаПоПолям.УникальныйИдентификаторПриемника КАК УникальныйИдентификаторПриемника,
	|		ТаблицаНеСопоставленныхОбъектовПриемникаПоПолям.ТипПриемника                     КАК ТипПриемника
	|	ИЗ
	|		ТаблицаНеСопоставленныхОбъектовПриемникаПоПолям КАК ТаблицаНеСопоставленныхОбъектовПриемникаПоПолям
	|	ЛЕВОЕ СОЕДИНЕНИЕ
	|		ТаблицаНеСопоставленныхОбъектовИсточникаПоПолям КАК ТаблицаНеСопоставленныхОбъектовИсточникаПоПолям
	|	ПО
	|		&УСЛОВИЕ_СОПОСТАВЛЕНИЯ_ПО_ПОЛЯМ
	|	
	|	ГДЕ
	|		НЕ ТаблицаНеСопоставленныхОбъектовИсточникаПоПолям.УникальныйИдентификаторИсточника ЕСТЬ NULL
	|	
	|	) КАК ВложенныйЗапрос
	|;
	|
	|//////////////////////////////////////////////////////////////////////////////// {ТаблицаНеправильноСопоставленныхОбъектовИсточника}
	|ВЫБРАТЬ
	|	
	|	// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
	|	УникальныйИдентификаторИсточника
	|	
	|ПОМЕСТИТЬ ТаблицаНеправильноСопоставленныхОбъектовИсточника
	|ИЗ
	|	(ВЫБРАТЬ
	|	
	|		// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
	|		УникальныйИдентификаторИсточника
	|	ИЗ
	|		ТаблицаАвтоматическиСопоставленныхОбъектовПолная
	|	СГРУППИРОВАТЬ ПО
	|		УникальныйИдентификаторИсточника
	|	ИМЕЮЩИЕ
	|		КОЛИЧЕСТВО(1) > 1
	|	
	|	) КАК ВложенныйЗапрос
	|;
	|
	|
	|//////////////////////////////////////////////////////////////////////////////// {ТаблицаНеправильноСопоставленныхОбъектовПриемника}
	|ВЫБРАТЬ
	|	
	|	// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
	|	УникальныйИдентификаторПриемника
	|	
	|ПОМЕСТИТЬ ТаблицаНеправильноСопоставленныхОбъектовПриемника
	|ИЗ
	|	(ВЫБРАТЬ
	|	
	|		// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
	|		УникальныйИдентификаторПриемника
	|	ИЗ
	|		ТаблицаАвтоматическиСопоставленныхОбъектовПолная
	|	СГРУППИРОВАТЬ ПО
	|		УникальныйИдентификаторПриемника
	|	ИМЕЮЩИЕ
	|		КОЛИЧЕСТВО(1) > 1
	|	
	|	) КАК ВложенныйЗапрос
	|;
	|
	|//////////////////////////////////////////////////////////////////////////////// {ТаблицаАвтоматическиСопоставленныхОбъектовПоПолям}
	|ВЫБРАТЬ
	|	
	|	&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,
	|	
	|	ПриемникИндексКартинки,
	|	ИсточникИндексКартинки,
	|	
	|	// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
	|	УникальныйИдентификаторИсточника,
	|	УникальныйИдентификаторПриемника,
	|	ТипИсточника,
	|	ТипПриемника
	|ПОМЕСТИТЬ ТаблицаАвтоматическиСопоставленныхОбъектовПоПолям
	|ИЗ
	|	(ВЫБРАТЬ
	|	
	|		&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,
	|	
	|		ТаблицаАвтоматическиСопоставленныхОбъектовПолная.ПриемникИндексКартинки,
	|		ТаблицаАвтоматическиСопоставленныхОбъектовПолная.ИсточникИндексКартинки,
	|	
	|		// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
	|		ТаблицаАвтоматическиСопоставленныхОбъектовПолная.УникальныйИдентификаторИсточника,
	|		ТаблицаАвтоматическиСопоставленныхОбъектовПолная.УникальныйИдентификаторПриемника,
	|		ТаблицаАвтоматическиСопоставленныхОбъектовПолная.ТипИсточника,
	|		ТаблицаАвтоматическиСопоставленныхОбъектовПолная.ТипПриемника
	|	ИЗ
	|		ТаблицаАвтоматическиСопоставленныхОбъектовПолная КАК ТаблицаАвтоматическиСопоставленныхОбъектовПолная
	|	
	|	ЛЕВОЕ СОЕДИНЕНИЕ
	|		ТаблицаНеправильноСопоставленныхОбъектовИсточника КАК ТаблицаНеправильноСопоставленныхОбъектовИсточника
	|	ПО
	|		ТаблицаАвтоматическиСопоставленныхОбъектовПолная.УникальныйИдентификаторИсточника = ТаблицаНеправильноСопоставленныхОбъектовИсточника.УникальныйИдентификаторИсточника
	|	
	|	ЛЕВОЕ СОЕДИНЕНИЕ
	|		ТаблицаНеправильноСопоставленныхОбъектовПриемника КАК ТаблицаНеправильноСопоставленныхОбъектовПриемника
	|	ПО
	|		ТаблицаАвтоматическиСопоставленныхОбъектовПолная.УникальныйИдентификаторПриемника = ТаблицаНеправильноСопоставленныхОбъектовПриемника.УникальныйИдентификаторПриемника
	|	
	|	ГДЕ
	|		  ТаблицаНеправильноСопоставленныхОбъектовИсточника.УникальныйИдентификаторИсточника ЕСТЬ NULL
	|		И ТаблицаНеправильноСопоставленныхОбъектовПриемника.УникальныйИдентификаторПриемника ЕСТЬ NULL
	|	
	|	) КАК ВложенныйЗапрос
	|;
	|
	|//////////////////////////////////////////////////////////////////////////////// {ТаблицаАвтоматическиСопоставленныхОбъектов}
	|ВЫБРАТЬ
	|	
	|	&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,
	|	
	|	ПриемникИндексКартинки,
	|	ИсточникИндексКартинки,
	|	
	|	// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
	|	УникальныйИдентификаторИсточника,
	|	УникальныйИдентификаторПриемника,
	|	ТипИсточника,
	|	ТипПриемника
	|ПОМЕСТИТЬ ТаблицаАвтоматическиСопоставленныхОбъектов
	|ИЗ
	|	(
	|	ВЫБРАТЬ
	|
	|		&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,
	|		
	|		ПриемникИндексКартинки,
	|		ИсточникИндексКартинки,
	|		
	|		// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
	|		УникальныйИдентификаторИсточника,
	|		УникальныйИдентификаторПриемника,
	|		ТипИсточника,
	|		ТипПриемника
	|	ИЗ
	|		ТаблицаАвтоматическиСопоставленныхОбъектовПоПолям
	|
	|	ОБЪЕДИНИТЬ ВСЕ
	|
	|	ВЫБРАТЬ
	|
	|		&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,
	|		
	|		ПриемникИндексКартинки,
	|		ИсточникИндексКартинки,
	|		
	|		// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
	|		УникальныйИдентификаторИсточника,
	|		УникальныйИдентификаторПриемника,
	|		ТипИсточника,
	|		ТипПриемника
	|	ИЗ
	|		ТаблицаАвтоматическиСопоставленныхОбъектовПоGUID
	|
	|	) КАК ВложенныйЗапрос
	|;
	|";
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
		"&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,",
		"#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#");
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
		"&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаАвтоматическиСопоставленныхОбъектовПоGUID_ВложенныйЗапрос,",
		"#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаАвтоматическиСопоставленныхОбъектовПоGUID_ВложенныйЗапрос#");
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
		"&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаНеСопоставленныхОбъектов,",
		"#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаНеСопоставленныхОбъектов#");
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
		"&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаАвтоматическиСопоставленныхОбъектовПолная_ВложенныйЗапрос,",
		"#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаАвтоматическиСопоставленныхОбъектовПолная_ВложенныйЗапрос#");
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
		"&УСЛОВИЕ_СОПОСТАВЛЕНИЯ_ПО_ПОЛЯМ",
		"#УСЛОВИЕ_СОПОСТАВЛЕНИЯ_ПО_ПОЛЯМ#");
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#УСЛОВИЕ_СОПОСТАВЛЕНИЯ_ПО_ПОЛЯМ#", ПолучитьУсловиеСопоставленияПоПолям(СписокПолейСопоставления));
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ИсточникПолеNN, ПриемникПолеNN,"));
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаНеСопоставленныхОбъектов#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ТаблицаНеСопоставленныхОбъектов.ИсточникПолеNN КАК ИсточникПолеNN, ТаблицаНеСопоставленныхОбъектов.ПриемникПолеNN КАК ПриемникПолеNN,"));
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаАвтоматическиСопоставленныхОбъектовПолная_ВложенныйЗапрос#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ТаблицаНеСопоставленныхОбъектовИсточникаПоПолям.ИсточникПолеNN КАК ИсточникПолеNN, ТаблицаНеСопоставленныхОбъектовПриемникаПоПолям.ПриемникПолеNN КАК ПриемникПолеNN,"));
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаАвтоматическиСопоставленныхОбъектовПоGUID_ВложенныйЗапрос#", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ТаблицаНеСопоставленныхОбъектовИсточника.ИсточникПолеNN КАК ИсточникПолеNN, ТаблицаНеСопоставленныхОбъектовПриемника.ПриемникПолеNN КАК ПриемникПолеNN,"));
	
	Запрос = Новый Запрос;
	Запрос.Текст = ТекстЗапроса;
	Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	
	Запрос.Выполнить();
	
КонецПроцедуры

Процедура ВыполнитьСортировкуТаблицыНаСервере()
	
	ПоляСортировки = ПолучитьПоляСортировкиНаСервере();
	
	Если Не ПустаяСтрока(ПоляСортировки) Тогда
		
		ТаблицаСопоставления().Сортировать(ПоляСортировки);
		
	КонецЕсли;
	
КонецПроцедуры

Процедура ПолучитьДайджестСопоставления(МенеджерВременныхТаблиц)
	
	// Получаем информацию количества сопоставленных объектов.
	ПолучитьКоличествоСопоставленныхОбъектов(МенеджерВременныхТаблиц);
	
	ДайджестСопоставления().КоличествоОбъектовВИсточнике = ОбменДаннымиСервер.КоличествоЗаписейВоВременнойТаблицеБазыДанных("ТаблицаИсточника", МенеджерВременныхТаблиц);
	ДайджестСопоставления().КоличествоОбъектовВПриемнике = ОбменДаннымиСервер.КоличествоЗаписейВТаблицеБазыДанных(ИмяТаблицыПриемника);
	
	КоличествоСопоставленныхОбъектовИсточника =   ИнформацияСтатистикиСопоставленияОбъектов().КоличествоОбъектовИсточникаСопоставленныхПоРегистру
												+ ИнформацияСтатистикиСопоставленияОбъектов().КоличествоОбъектовСопоставленныхПоНеутвержденнымСвязям;
	//
	КоличествоСопоставленныхОбъектовПриемника =   ИнформацияСтатистикиСопоставленияОбъектов().КоличествоОбъектовИсточникаСопоставленныхПоРегистру
												+ ИнформацияСтатистикиСопоставленияОбъектов().КоличествоОбъектовПриемникаСопоставленныхПоРегистру
												+ ИнформацияСтатистикиСопоставленияОбъектов().КоличествоОбъектовСопоставленныхПоНеутвержденнымСвязям;
	
	КоличествоНесопоставленныхОбъектовИсточника = Макс(0, ДайджестСопоставления().КоличествоОбъектовВИсточнике - КоличествоСопоставленныхОбъектовИсточника);
	КоличествоНесопоставленныхОбъектовПриемника = Макс(0, ДайджестСопоставления().КоличествоОбъектовВПриемнике - КоличествоСопоставленныхОбъектовПриемника);
	
	ПроцентСопоставленияОбъектовИсточника = ?(ДайджестСопоставления().КоличествоОбъектовВИсточнике = 0, 0, 100 - Цел(100 * КоличествоНесопоставленныхОбъектовИсточника / ДайджестСопоставления().КоличествоОбъектовВИсточнике));
	ПроцентСопоставленияОбъектовПриемника = ?(ДайджестСопоставления().КоличествоОбъектовВПриемнике = 0, 0, 100 - Цел(100 * КоличествоНеСопоставленныхОбъектовПриемника / ДайджестСопоставления().КоличествоОбъектовВПриемнике));
	
	ДайджестСопоставления().ПроцентСопоставленияОбъектов = Макс(ПроцентСопоставленияОбъектовИсточника, ПроцентСопоставленияОбъектовПриемника);
	
	ДайджестСопоставления().КоличествоОбъектовНесопоставленных = Мин(КоличествоНесопоставленныхОбъектовИсточника, КоличествоНесопоставленныхОбъектовПриемника);
	
	ДайджестСопоставления().КоличествоОбъектовСопоставленных = КоличествоСопоставленныхОбъектовПриемника;
	
КонецПроцедуры

Процедура ПолучитьКоличествоСопоставленныхОбъектов(МенеджерВременныхТаблиц)
	
	// Получаем количества сопоставленных объектов.
	ТекстЗапроса = "
	|ВЫБРАТЬ
	|	Количество(*) КАК Количество
	|ИЗ
	|	ТаблицаСопоставленныхОбъектовИсточникаПоРегистру
	|;
	|/////////////////////////////////////////////////////////////////////////////
	|
	|ВЫБРАТЬ
	|	Количество(*) КАК Количество
	|ИЗ
	|	ТаблицаСопоставленныхОбъектовПриемникаПоРегистру
	|;
	|/////////////////////////////////////////////////////////////////////////////
	|
	|ВЫБРАТЬ
	|	Количество(*) КАК Количество
	|ИЗ
	|	ТаблицаСопоставленныхОбъектовПоНеутвержденнымСвязям
	|;
	|/////////////////////////////////////////////////////////////////////////////
	|";
	
	Запрос = Новый Запрос;
	Запрос.Текст                   = ТекстЗапроса;
	Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	
	МассивРезультатов = Запрос.ВыполнитьПакет();
	
	ИнформацияСтатистикиСопоставленияОбъектов().КоличествоОбъектовИсточникаСопоставленныхПоРегистру    = МассивРезультатов[0].Выгрузить()[0]["Количество"];
	ИнформацияСтатистикиСопоставленияОбъектов().КоличествоОбъектовПриемникаСопоставленныхПоРегистру    = МассивРезультатов[1].Выгрузить()[0]["Количество"];
	ИнформацияСтатистикиСопоставленияОбъектов().КоличествоОбъектовСопоставленныхПоНеутвержденнымСвязям = МассивРезультатов[2].Выгрузить()[0]["Количество"];
	
КонецПроцедуры

Процедура ДобавитьПолеНомераВТаблицуСопоставления()
	
	ТаблицаСопоставления().Колонки.Добавить("НомерПоПорядку", Новый ОписаниеТипов("Число"));
	
	Для Каждого СтрокаТаблицы Из ТаблицаСопоставления() Цикл
		
		СтрокаТаблицы.НомерПоПорядку = ТаблицаСопоставления().Индекс(СтрокаТаблицы);
		
	КонецЦикла;
	
КонецПроцедуры

Функция ОбъединитьТаблицыНеутвержденныхСвязейИАвтоматическогоСопоставления(МенеджерВременныхТаблиц)
	
	ТекстЗапроса = "
	|ВЫБРАТЬ
	|
	|	// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
	|	УникальныйИдентификаторИсточника,
	|	УникальныйИдентификаторПриемника,
	|	ТипИсточника,
	|	ТипПриемника
	|ИЗ
	|	(
	|	ВЫБРАТЬ
	|
	|		// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
	|		УникальныйИдентификаторИсточника,
	|		УникальныйИдентификаторПриемника,
	|		ТипИсточника,
	|		ТипПриемника
	|	ИЗ 
	|		ТаблицаНеутвержденныхСвязей
	|
	|	ОБЪЕДИНИТЬ
	|
	|	ВЫБРАТЬ
	|
	|		// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
	|		УникальныйИдентификаторПриемника КАК УникальныйИдентификаторИсточника,
	|		УникальныйИдентификаторИсточника КАК УникальныйИдентификаторПриемника,
	|		ТипПриемника                     КАК ТипИсточника,
	|		ТипИсточника                     КАК ТипПриемника
	|	ИЗ 
	|		ТаблицаАвтоматическиСопоставленныхОбъектов
	|
	|	) КАК ВложенныйЗапрос
	|
	|";
	
	Запрос = Новый Запрос;
	Запрос.Текст = ТекстЗапроса;
	Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	
	Возврат Запрос.Выполнить().Выгрузить();
	
КонецФункции

Функция ТаблицаАвтоматическиСопоставленныхОбъектовПолучить(МенеджерВременныхТаблиц, ПользовательскиеПоля)
	
	ТекстЗапроса = "
	|ВЫБРАТЬ
	|	
	|	&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,
	|	
	|	ИСТИНА КАК Пометка,
	|	
	|	ПриемникИндексКартинки,
	|	ИсточникИндексКартинки,
	|	
	|	// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
	|	УникальныйИдентификаторПриемника КАК УникальныйИдентификаторИсточника,
	|	УникальныйИдентификаторИсточника КАК УникальныйИдентификаторПриемника,
	|	ТипПриемника                     КАК ТипИсточника,
	|	ТипИсточника                     КАК ТипПриемника
	|ИЗ
	|	ТаблицаАвтоматическиСопоставленныхОбъектов
	|";
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ИсточникПолеNN, ПриемникПолеNN,"));
	
	Запрос = Новый Запрос;
	Запрос.Текст = ТекстЗапроса;
	Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	
	Возврат Запрос.Выполнить().Выгрузить();
	
КонецФункции

Функция РезультатСопоставленияОбъектов(ТаблицаИсточника, ПользовательскиеПоля, МенеджерВременныхТаблиц)
	
	ТекстЗапроса = "
	|////////////////////////////////////////////////////////////////////////////////
	|
	|ВЫБРАТЬ
	|
	|	&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,
	|
	|	&ПОЛЯ_СОРТИРОВКИ,
	|
	|	СтатусСопоставления,
	|	СтатусСопоставленияДополнительный,
	|
	|	ИсточникИндексКартинки КАК ИндексКартинки,
	|
	|	ПриемникИндексКартинки,
	|	ИсточникИндексКартинки,
	|
	|	// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
	|	УникальныйИдентификаторИсточника,
	|	УникальныйИдентификаторПриемника,
	|	ТипИсточника,
	|	ТипПриемника
	|ИЗ
	|	ТаблицаНеСопоставленныхОбъектовИсточника
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|
	|	&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,
	|
	|	&ПОЛЯ_СОРТИРОВКИ,
	|
	|	СтатусСопоставления,
	|	СтатусСопоставленияДополнительный,
	|
	|	ПриемникИндексКартинки КАК ИндексКартинки,
	|
	|	ПриемникИндексКартинки,
	|	ИсточникИндексКартинки,
	|
	|	// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
	|	УникальныйИдентификаторИсточника,
	|	УникальныйИдентификаторПриемника,
	|	ТипИсточника,
	|	ТипПриемника
	|ИЗ
	|	ТаблицаНеСопоставленныхОбъектовПриемника
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|
	|	&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,
	|
	|	&ПОЛЯ_СОРТИРОВКИ,
	|
	|	СтатусСопоставления,
	|	СтатусСопоставленияДополнительный,
	|
	|	ПриемникИндексКартинки КАК ИндексКартинки,
	|
	|	ПриемникИндексКартинки,
	|	ИсточникИндексКартинки,
	|
	|	// {ДАННЫЕ РЕГИСТРА СОПОСТАВЛЕНИЯ}
	|	УникальныйИдентификаторИсточника,
	|	УникальныйИдентификаторПриемника,
	|	ТипИсточника,
	|	ТипПриемника
	|ИЗ
	|	ТаблицаСопоставленныхОбъектов
	|";
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПОЛЬЗОВАТЕЛЬСКИЕ_ПОЛЯ_ТаблицаСопоставления,", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ИсточникПолеNN, ПриемникПолеNN,"));
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПОЛЯ_СОРТИРОВКИ,", ПолучитьПользовательскиеПоля(ПользовательскиеПоля, "ПолеСортировкиNN,"));
	
	Запрос = Новый Запрос;
	Запрос.Текст = ТекстЗапроса;
	Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	
	Возврат Запрос.Выполнить().Выгрузить();
	
КонецФункции

Функция ДанныеИнформационнойБазыИсточника(Отказ)
	
	// Возвращаемое значение функции.
	ТаблицаДанных = Неопределено;
	
	СтруктураНастроекОбмена = ОбменДаннымиСервер.СтруктураНастроекОбменаДляСеансаИнтерактивнойЗагрузки(УзелИнформационнойБазы, ИмяФайлаСообщенияОбмена);
	
	Если СтруктураНастроекОбмена.Отказ Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	ОбработкаОбменаДанными = СтруктураНастроекОбмена.ОбработкаОбменаДанными;
	
	КлючТаблицыДанных = ОбменДаннымиСервер.КлючТаблицыДанных(ТипИсточникаСтрокой, ТипПриемникаСтрокой, ЭтоУдалениеОбъекта);
	
	// Таблица данных может быть уже загружена и находиться в кэше обработки ОбработкаОбменаДанными.
	ТаблицаДанных = ОбработкаОбменаДанными.ТаблицыДанныхСообщенияОбмена().Получить(КлючТаблицыДанных);
	
	// Если таблица данных не была загружена, то загружаем ее.
	Если ТаблицаДанных = Неопределено Тогда
		
		ТаблицыДляЗагрузки = Новый Массив;
		ТаблицыДляЗагрузки.Добавить(КлючТаблицыДанных);
		
		// ВЫПОЛНЯЕМ ЗАГРУЗКУ ДАННЫХ В РЕЖИМЕ СОПОСТАВЛЕНИЯ (данные зачитываем в таблицу значений).
		ОбработкаОбменаДанными.ВыполнитьЗагрузкуДанныхВТаблицуЗначений(ТаблицыДляЗагрузки);
		
		Если ОбработкаОбменаДанными.ФлагОшибки() Тогда
			
			НСтрока = НСтр("ru = 'При загрузке сообщения обмена возникли ошибки: %1'");
			НСтрока = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтрока, ОбработкаОбменаДанными.СтрокаСообщенияОбОшибке());
			ОбщегоНазначения.СообщитьПользователю(НСтрока,,,, Отказ);
			Возврат Неопределено;
		КонецЕсли;
		
		ТаблицаДанных = ОбработкаОбменаДанными.ТаблицыДанныхСообщенияОбмена().Получить(КлючТаблицыДанных);
		
	КонецЕсли;
	
	Если ТаблицаДанных = Неопределено Тогда
		
		Отказ = Истина;
		
	КонецЕсли;
	
	Возврат ТаблицаДанных;
КонецФункции

Функция ПолучитьПользовательскиеПоля(ПользовательскиеПоля, ШаблонПоля)
	
	// Возвращаемое значение функции.
	Результат = "";
	
	Для Каждого Поле Из ПользовательскиеПоля Цикл
		
		НомерПоля = ПользовательскиеПоля.Найти(Поле) + 1;
		
		ТекущееПоле = СтрЗаменить(ШаблонПоля, "#", Поле);
		
		ТекущееПоле = СтрЗаменить(ТекущееПоле, "NN", Строка(НомерПоля));
		
		Результат = Результат + Символы.ПС + ТекущееПоле;
		
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

Функция ПолучитьПоляСортировкиНаСервере()
	
	// Возвращаемое значение функции.
	ПоляСортировки = "";
	
	ШаблонПоля = "ПолеСортировкиNN #НаправлениеСортировки"; // Не локализуется
	
	Для Каждого СтрокаТаблицы Из ТаблицаСортировки Цикл
		
		Если СтрокаТаблицы.Использование Тогда
			
			Разделитель = ?(ПустаяСтрока(ПоляСортировки), "", ", ");
			
			НаправлениеСортировкиСтр = ?(СтрокаТаблицы.НаправлениеСортировки, "Возр", "Убыв");
			
			ЭлементСписка = СписокИспользуемыхПолей.НайтиПоЗначению(СтрокаТаблицы.ИмяПоля);
			
			ИндексПоля = СписокИспользуемыхПолей.Индекс(ЭлементСписка) + 1;
			
			ИмяПоля = СтрЗаменить(ШаблонПоля, "NN", Строка(ИндексПоля));
			ИмяПоля = СтрЗаменить(ИмяПоля, "#НаправлениеСортировки", НаправлениеСортировкиСтр);
			
			ПоляСортировки = ПоляСортировки + Разделитель + ИмяПоля;
			
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат ПоляСортировки;
	
КонецФункции

Функция ПолучитьУсловиеСопоставленияПоПолям(СписокПолейСопоставления)
	
	// Возвращаемое значение функции.
	Результат = "";
	
	Для Каждого Элемент Из СписокПолейСопоставления Цикл
		
		Если Элемент.Пометка Тогда
			
			Если СтрНайти(Элемент.Представление, ОбменДаннымиСервер.СтрокаНеограниченнойДлины()) > 0 Тогда
				
				ШаблонПоля = "ПОДСТРОКА(ТаблицаНеСопоставленныхОбъектовПриемникаПоПолям.ПриемникПолеNN, 0, 1024) = ПОДСТРОКА(ТаблицаНеСопоставленныхОбъектовИсточникаПоПолям.ИсточникПолеNN, 0, 1024)";
				
			Иначе
				
				ШаблонПоля = "ТаблицаНеСопоставленныхОбъектовПриемникаПоПолям.ПриемникПолеNN = ТаблицаНеСопоставленныхОбъектовИсточникаПоПолям.ИсточникПолеNN";
				
			КонецЕсли;
			
			НомерПоля = СписокПолейСопоставления.Индекс(Элемент) + 1;
			
			ТекущееПоле = СтрЗаменить(ШаблонПоля, "NN", Строка(НомерПоля));
			
			ЛитералОперации = ?(ПустаяСтрока(Результат), "", "И");
			
			Результат = Результат + Символы.ПС + ЛитералОперации + " " + ТекущееПоле;
			
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

////////////////////////////////////////////////////////////////////////////////
// Вспомогательные служебные процедуры и функции.

Процедура ЗаполнитьСписокОтмеченнымиЭлементами(СписокИсточник, СписокПриемник)
	
	СписокПриемник.Очистить();
	
	Для Каждого Элемент Из СписокИсточник Цикл
		
		Если Элемент.Пометка Тогда
			
			СписокПриемник.Добавить(Элемент.Значение, Элемент.Представление, Истина);
			
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

Процедура ЗаполнитьТаблицуСортировки(СписокЗначенийИсточник)
	
	ТаблицаСортировки.Очистить();
	
	Для Каждого Элемент Из СписокЗначенийИсточник Цикл
		
		ЭтоПервоеПоле = СписокЗначенийИсточник.Индекс(Элемент) = 0;
		
		СтрокаТаблицы = ТаблицаСортировки.Добавить();
		
		СтрокаТаблицы.ИмяПоля               = Элемент.Значение;
		СтрокаТаблицы.Использование         = ЭтоПервоеПоле; // По умолчанию сортируем по первому полю.
		СтрокаТаблицы.НаправлениеСортировки = Истина; // по возрастанию
		
	КонецЦикла;
	
КонецПроцедуры

Процедура ЗаполнитьСписокДополнительнымиПараметрами(СписокПолейТаблицы)
	
	ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип(ИмяТипаОбъектаТаблицыИсточника));
	
	СписокПолейДляУдаления = Новый Массив;
	ТипХранилищеЗначения = Новый ОписаниеТипов("ХранилищеЗначения");
	
	Для каждого Элемент Из СписокПолейТаблицы Цикл
		
		Реквизит = ОбъектМетаданных.Реквизиты.Найти(Элемент.Значение);
		
		Если  Реквизит = Неопределено
			И ОбменДаннымиСервер.ЭтоСтандартныйРеквизит(ОбъектМетаданных.СтандартныеРеквизиты, Элемент.Значение) Тогда
			
			Реквизит = ОбъектМетаданных.СтандартныеРеквизиты[Элемент.Значение];
			
		КонецЕсли;
		
		Если Реквизит = Неопределено Тогда
			ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Для объекта метаданных ""%1"" не определен реквизит с именем ""%2""'"),
				ОбъектМетаданных.ПолноеИмя(),
				Строка(Элемент.Значение));
		КонецЕсли;
			
		Если Реквизит.Тип = ТипХранилищеЗначения Тогда
			
			СписокПолейДляУдаления.Добавить(Элемент);
			Продолжить;
			
		КонецЕсли;
		
		Представление = "";
		
		Если ЭтоСтрокаНеограниченнойДлины(Реквизит) Тогда
			
			Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1 %2",
				?(ПустаяСтрока(Реквизит.Синоним), Реквизит.Имя, СокрЛП(Реквизит.Синоним)),
				ОбменДаннымиСервер.СтрокаНеограниченнойДлины());
		Иначе
			
			Представление = СокрЛП(Реквизит.Синоним);
			
		КонецЕсли;
		
		Если ПустаяСтрока(Представление) Тогда
			
			Представление = Реквизит.Имя;
			
		КонецЕсли;
		
		Элемент.Представление = Представление;
		
	КонецЦикла;
	
	Для Каждого УдаляемыйЭлемент Из СписокПолейДляУдаления Цикл
		
		СписокПолейТаблицы.Удалить(УдаляемыйЭлемент);
		
	КонецЦикла;
	
КонецПроцедуры

Процедура ПроверитьКоличествоПолейСопоставленияВМассиве(Массив)
	
	Если Массив.Количество() > ОбменДаннымиСервер.МаксимальноеКоличествоПолейСопоставленияОбъектов() Тогда
		
		Массив.Удалить(Массив.ВГраница());
		
		ПроверитьКоличествоПолейСопоставленияВМассиве(Массив);
		
	КонецЕсли;
	
КонецПроцедуры

Процедура ДобавитьПолеПоиска(Массив, Значение)
	
	Элемент = СписокПолейТаблицы.НайтиПоЗначению(Значение);
	
	Если Элемент <> Неопределено Тогда
		
		Массив.Добавить(Элемент.Значение);
		
	КонецЕсли;
	
КонецПроцедуры

Функция ЭтоСтрокаНеограниченнойДлины(Реквизит)
	
	Возврат Реквизит.Тип = ТипСтрокаНеограниченнойДлины();
	
КонецФункции

#КонецОбласти

#Иначе
ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'");
#КонецЕсли